当前位置: 首页 > 知识库问答 >
问题:

Maven创建了Spring Web项目,但只有在我将它的war部署到Tomcat时才起作用,并且在Eclipse中启动时失败了。

燕寒
2023-03-14

我正在使用Spring版本4.1.1.RELEASE与junit版本4.11

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

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

为了让jUnit能够读取Spring的上下文配置,我必须将Spring的servlet配置文件放在:src/main/Resources/config/spring-servlet.xml。Maven会将此文件复制到 /target//WEB-INF/class/config/spring-servlet.xml

为了使此配置适用于JUnit和Tomcat Web容器,我必须进行以下修改

对于 Junit:

数字一(one)

@ContextConfiguration({ "classpath:config/spring-servlet.xml" })
public class AnotherTest { ... }

对于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>

对于 junit 和 tomcat 部署来说,情况都很好。

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

他们建议我们应该使用下面的config(即option2)代替,以避免使用“classpath:”

<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>

使用选项2,junit工作正常。但是在 eclipse 中运行此 Web 项目会在 tomcat 启动时导致 FileNotFoundException,因为 tomcat 容器看不到 spring-servlet.xml。当然,我已经执行了Maven clean。

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

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

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

或者有没有其他更好的方法(比如另一个目录)来存储和配置文件spring-servlet.xml,请说明。

谢谢你。

共有1个答案

关正雅
2023-03-14

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

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

Project
    Module
        src
            main
                Java
                resources
                webapp
            test
                Java
                resources

以下是我们所做的几个选项。

  • 使用classpath*:访问上下文XML文件
    • 用于@ContextConfiguration中的测试用例,这些测试用例将从主/资源
    • 访问
    • 对于web.xml中的引用,上下文文件将位于main/Resources

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

    混淆上下文?真的吗?大多数情况下,使用classpath*将在执行中访问所有文件。这里可能会出现多个jar的名称相同的情况,尽管我从来没有遇到过这种情况。

    正在测试的 Junit 的另一个上下文文件/资源

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

      <李>嘲讽豆 < li >为模拟场景配置derby数据库

    即使会发生内部访问,访问生成的类也不是首选方法。

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

 类似资料:
  • 1.[localhost-startStop-1]org.apache.Catalina.core.containerbase.addchildinal containerbase.addchild:start:org.apache.Catalina.lifecycleException:无法启动组件[StandardEngine[Catalina].StandardHost[localhost]

  • 我在eclipse IDE中有一个ant项目。Ant build在dist文件夹中创建一个war。我将war复制到Tomcat webapps文件夹并成功部署它。现在,我将Tomcat添加到eclipse中,并尝试在这里部署war,它会忽略war文件。它没有给出任何例外bu也没有做任何有用的事情。下面是完整的Tomcat日志- 它是一个动态的Web模块项目。在Eclipse中设置Tomcat时是否

  • 我正在使用Eclipse开普勒和Maven的M2E插件。 我想用我的“Util”Maven项目创建web app Maven项目——这不是一个多模块项目。我只想要这么简单。jar在项目中,可以在使用主项目的过程中编辑带有增强和修复的“Util”项目。 我在webb应用程序中只添加了maven依赖项(没有构建路径、部署程序集等设置),Eclipse自动发现这是来自工作区的项目(简单地说:不是带有版本

  • 我在项目中使用JUnit进行代码覆盖。对于db,我将dbunit用作模拟db。当我从EclipseUI运行JUnit时,它会被通过,但在运行maven时会失败。 通过使用maven,上述设置在JDK 1.6.25中运行良好,升级到1.8.51时开始失败。我已经更新了maven编译器插件,它不工作。我使用以下版本,jUnit-4.72.dbunit-2.4.8 hsqldb-2.0.0 maven-

  • 错误是:至少扫描了一个JAR的顶级域,但没有包含顶级域。为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的JAR的完整列表。在扫描过程中跳过不需要的JAR可以提高启动时间和JSP编译时间。

  • 默认情况下,maven插件与最新的Eclipse IDE版本(例如,Mars)集成在一起。但是,在创建Maven项目时,它只会抛出以下错误: 注意:它不经过任何代理设置 无法计算构建计划:Plugin org.apache.maven.plugins:maven-resources-plugin:2.6或无法解决其依赖项之一:未能在http://localhost:8081/nexus/conte