【问题标题】:Spring ContextLoader fails to find applicationContext.xmlSpring ContextLoader 找不到 applicationContext.xml
【发布时间】:2011-01-12 13:32:15
【问题描述】:

我长期以来一直独自从事一个项目,现在另一位开发人员加入了,所以我想从 SVN 在他的机器上设置项目。我们都使用非常相似的设置:

  • OS X 雪豹
  • 最新的 Eclipse WTP
  • m2eclipse Maven 插件
  • 颠覆性的 SVN 插件
  • Tomcat 6.0.24

使用的 Spring 版本是 2.5.6。

我使用 Eclipse 的“来自 SVN 的项目”工具在他的机器上设置项目,本质上是创建项目的 1:1 副本。据我所知,Maven 处理了所有依赖项没有问题,项目编译没有问题。项目结构遵循 webapps 的 Maven 标准,资源(如 applicationContext.xml)在 src/main/resources,项目代码在 src/main/java 和所有 web-app 相关文件在 src/main/webapp 和 src /main/webapp/WEB-INF 分别。

web.xml 被配置为像这样加载上下文:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

使用 Eclipse 的“服务器”工具,我尝试直接从 Eclipse 启动应用程序,但在尝试加载 applicationContext.xml 时它立即失败并出现 FileNotFoundException。

由于从 SVN 签出的代码没有受到影响,我猜这个问题与 Maven 插件的某些参数有关。或者我忘记了完成设置的一些重要步骤。有没有人遇到过类似的问题或知道我应该从哪里开始寻找?

非常感谢您的帮助!

【问题讨论】:

  • 检查文件是否已复制到适当的位置 - 即 WEB-INF/classes/applicationContext.xml
  • 它不会被复制到 WEB-INF/classes,但在我自己的(正常运行的)项目中并非如此。相反,该文件会按照 Maven 标准复制到目标/类。这似乎再次适用于两台机器。可能缺少一些配置,以便在启动时将此文件夹作为类路径的一部分包含在内?

标签: java eclipse spring maven-2 m2eclipse


【解决方案1】:

项目结构遵循 webapps 的 Maven 标准,资源(如 applicationContext.xml)在 src/main/resources,项目代码在 src/main/java 和所有 web-app 相关文件在 src/main/ webapp 和 src/main/webapp/WEB-INF。

这是正确的并且非常好(因为您希望 applicationContext.xml 位于测试类路径上)。

它不会被复制到 WEB-INF/classes,但在我自己的(正在运行的)项目中并非如此。相反,该文件会按照 Maven 标准复制到目标/类。

复制到target/yourapp/WEB-INF/classes,但不是process-resources,它在资源更改时由m2eclipse默认调用(此目标将资源复制/过滤到target/classes)。这发生在package 阶段(或显式调用war:warwar:inplacewar:exploded 时)。正如usage 页面中所述,WAR 插件不负责编译 java 源代码或复制资源

所以我建议package 战争之前在服务器上运行它。也许您可以将 m2eclipse 配置为在资源更改时自动执行此操作(在您的项目上右键单击,然后选择 Properties > Maven 并将适当的 war 目标添加到 在资源更改时调用的目标)。不过没试过。

【讨论】:

  • 非常感谢,这解决了问题。通过这样做,我还在我们的 Maven 代理上遇到了一个权限问题,所以这是一个很好的奖励。
【解决方案2】:

使用服务器插件启动应用程序时,它希望您的 Web 文件夹包含所需的所有内容。这就是为什么您必须将项目输出文件夹(来自项目构建路径选项)配置为 src/main/webapp/WEB-INF/classes

您也可以使用FileSync 插件来复制文件。

顺便说一句,您没有指定服务器插件的选项,以及您的项目是否是“动态 Web 项目”(即可部署)。

【讨论】:

  • 我不认为将输出文件夹配置为src/main/webapp/WEB-INF/classes 是一个好主意。仅供参考,如果您有 m2eclipse WTP 支持(这里可能就是这种情况),则默认情况下,包装类型为 war 的项目将被识别为“动态 Web 项目”。
  • 保存时会更新吗?在我当前的配置中,输出文件夹是默认的(目标/类),但我使用的是 FileSync,因此在 xml 中的单个更改不需要整个 maven 构建。否则会调用 maven 构建,这没关系,但速度有点慢。
  • 我并不是说这是一个完美的解决方案,但在 src 中生成东西确实不是很好的 IMO(不会被 clean 清理)。生成的东西应该放在target。最终,m2eclipse 插件应该得到改进:)
  • 同意 m2eclipse :) 而且 src 应该是干净的 - 这就是我使用 FileSync 的原因。但我见过这样的配置,他们工作(当然有适当的 svn:ignore)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2011-08-07
  • 1970-01-01
  • 2014-05-25
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多