Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven创建了SpringWeb项目,但只有在我将其war部署到Tomcat时才起作用,在Eclipse中启动时失败_Spring_Maven_Junit - Fatal编程技术网

Maven创建了SpringWeb项目,但只有在我将其war部署到Tomcat时才起作用,在Eclipse中启动时失败

Maven创建了SpringWeb项目,但只有在我将其war部署到Tomcat时才起作用,在Eclipse中启动时失败,spring,maven,junit,Spring,Maven,Junit,我使用的是SpringVersion4.1.1.RELEASE和JUnitVersion4.11 我创建了一个类型为“Maven archetype webapp”的Maven 在使用junit之前,我将spring-servlet.xml放在webapp/WEB-INF/中。此配置对于TomcatWeb容器很有效,但Junit无法引用此上下文文件,因为Junit对类路径的感知不包括webapp/web-INF/ 为了让junit能够读取spring的上下文配置,我必须将spring的servl

我使用的是SpringVersion4.1.1.RELEASE和JUnitVersion4.11

我创建了一个类型为“Maven archetype webapp”的Maven

在使用junit之前,我将spring-servlet.xml放在webapp/WEB-INF/中。此配置对于TomcatWeb容器很有效,但Junit无法引用此上下文文件,因为Junit对类路径的感知不包括webapp/web-INF/

为了让junit能够读取spring的上下文配置,我必须将spring的servlet配置文件放在:src/main/resources/config/spring-servlet.xml。Maven将把这个文件复制到/target//WEB-INF/classes/config/springservlet.xml

为了使这个配置同时适用于JUnit和TomcatWeb容器,我必须进行以下修改

对于Junit:

<servlet>
  <servlet-name>spring</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:config/spring-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
  <servlet-name>spring</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/classes/config/spring-servlet.xml</param-value> <!-- this config does not use classpath -->
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
1> 使用注释通知junit文件“springservlet.xml”的位置

对于Tomcat部署:

<servlet>
  <servlet-name>spring</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:config/spring-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
  <servlet-name>spring</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/classes/config/spring-servlet.xml</param-value> <!-- this config does not use classpath -->
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

春天
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
类路径:config/spring-servlet.xml
1.
对于junit和tomcat部署,情况都很好

但从一些来源来看,他们说使用“classpath:”在某些情况下会导致上下文混淆(我不知道是哪种情况?)

他们建议我们应该使用下面的配置(即选项2),以避免使用“类路径:


春天
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
WEB-INF/classes/config/spring-servlet.xml
1.
使用选项2,junit可以正常工作。但是在eclipse中运行这个web项目会在tomcat启动时导致FileNotFoundException,因为tomcat容器没有看到spring-servlet.xml。当然,在我执行Maven启动Tomcat之前,我已经执行了Maven clean&build并确保war已经创建,我还检查并查看/target//WEB-INF/classes/config/spring-servlet.xml已经创建,Java类已经编译

我发现,如果我复制Maven创建的war文件,并手动将此war部署到Tomcat中,那么一切都可以正常工作

我怀疑,在Maven启动Tomcat时,使用Eclipse的Maven没有正确地生成WEB-INF/classes/config/spring-servlet.xml。至少,我认为Maven和Eclipse并不是简单地使用已经构建的(即项目的java类和其他资源)来运行/部署Tomcat

我是否可以使用上面选项2中的配置在Eclipse中进行开发,以启动Tomcat并正确执行Junit

或者是否有其他更好的方法(例如另一个目录)来存储和配置文件spring-servlet.xml,请解释


谢谢。

有很多方法可以实现,下面是我避免这种情况的方法之一

我希望遵循maven给出的相同的自定义目录结构

Project
    Module
        src
            main
                Java
                resources
                webapp
            test
                Java
                resources
下面是我们可以做的几个选择

  • 使用
    classpath*:
    • 对于
      @ContextConfiguration
      中的测试用例,可以从
      main/resources
    • 对于web.xml中的引用,上下文文件将位于
      main/resources
  • 为junit测试编写单独的上下文文件
但从一些来源来看,他们说使用“classpath:”在某些情况下会导致上下文混淆(我不知道是哪种情况?)

混淆上下文?认真地 大多数情况下,使用classpath*可以访问执行中的所有文件。这里可能是多个jar的名称相同的情况,尽管我在任何时候都没有遇到过这种情况

测试中Junit的另一个上下文文件/resources

这使我们能够灵活地更改用于测试的环境。 比如说

  • 模仿豆
  • 为模拟场景配置derby数据库
即使会发生内部访问,访问生成的类也不是最好的方法


我相信在这里,与spring/junit的版本无关。这一切都是关于从不同角度访问上下文文件。

我的项目结构与您提供的一样。正如您前面提到的,我还尝试了“test/resources下的Junit的另一个上下文文件”,它可以正常工作。但我关心的是保持2-servlet.xml文件之间的同步。一个文件是/WEB-INF/-servlet.xml,另一个文件是src/resources/config/-servlet.xml,特别是当一个多地点团队处理多模块时。顺便问一下,有没有提到过关于拥有两个文件的其他来源-servlet.xml是一种好的做法?另一个问题是:在这种情况下,我们只想为JUnit和Tomcat的servlet容器保留一个文件src/resources/config/-servlet.xml,那么如果我们不使用“classpath:”,我们该怎么办?为什么我们需要两个文件放在两个不同的位置,而这两个内容都是相同的?这就是您提到的吗“另一个Junit上下文文件正在测试/参考资料中“?
一个文件是/WEB-INF/-servlet.xml,另一个文件是src/resources/config/-servlet.xml,
这是完全不同的!当您在
main\resources
下有一个上下文文件时,我的回答是在
test\resources
下创建上下文文件,以便在需要时维护模拟bean。这与在
/WEB-INF
下创建文档无关。当它是同一个文件时,为什么我们需要两个文件?