IDEA使用maven搭建Spring Web项目 class path resource [.xml] cannot be opened because it does not exist

        之前学习spring的时候搭建过一次,结果毕设弄了两个多月,突发奇想,想做一个网页时发现自己又忘记了,再次碰到一堆问题并因为小问题浪费了很多时间,总算明白了还是记录一下比较好,以后也应该避免拖拉。

        首先确定流程:使用maven新建web项目,再添加spring

        1.新建项目

        File→New→Project

            

        选择maven-archetype-webapp

        

        输入GroupId和ArtifactId并点击Next

        

        因为并没有改过配置文件,直接Next

        

        选择项目路径,然后完成创建。

        

        默认项目文件结构如下,根据自己的需要调整为

        

        2.添加spring

        在pom.xml中添加依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>newWeb</groupId>
  <artifactId>newWeb</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>newWeb Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.0.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.0.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.7.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>42.2.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.3.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.1</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>newWeb</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

        在Project Structure中,将java、resources分别设置为Sources(蓝色)和Resources,这里比较奇怪,我添加了依赖之后被自动设置了,可能是IDEA的功劳。输出路径项目已经默认配置为了target

        

        添加spring配置文件,在resources文件夹中新建newWeb-context.xml

        

        这里给自己记录一下,设置为resources文件夹后,其下面的文件会被输出到输出目录下,不然target下的classes路径下没有newWeb-context.xml,而在web.xml中需要修改默认的applicationContext.xml路径,具体做法为,在web.xml中添加

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:newWeb-context.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>newWeb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value></param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>newWeb</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

        context-param定义了一个上下文,“classpath:”指明在输出的classes路径下存在着newWeb-context.xml,并且需要在servlet的init-param中引用这个上下文,至此一个空的项目就搭建完了。

        同时记录一下遇到的问题,启动时报错:

                        class path resource [.xml] cannot be opened because it does not exist

        正是由于默认的applicationContext.xml在WEB-INF下,而IDEA将资源文件生成到classes目录下,如果不配置上下文就会导致找不到/WEB_INF/*.xml,因此使用上下文指定 applicationContext.xml的位置。另外自己由于对配置文件的不了解,在添加了context-param后没有在servlet中使用init-param添加上下文,导致了另一个问题的出现(按照网上的说法应该是不用额外写init-param,因为context-param改变了全局的位置,而init-param只改变了该servlet,但是确实去掉就会报错。暂时没明白是为什么),这时显示的是:
                        could not open ServletContext resource [/WEB-INF/*.xml]
        添加了 init-param即解决问题

        

        

猜你喜欢

转载自blog.csdn.net/Micusd/article/details/80715523
今日推荐