我正在尝试将现有项目从Ant项目迁移到Maven项目。Ant项目的结构为:
|-root
|---resources
|------foo
|------yaz
|---src
|------SomeFile.java
Maven项目的结构是
|-root
|---src
|------main
|---------java
|------------SomeFile.java
|------test
|---------resources
|------------foo
|------------yaz
不幸的是,代码中有很多对"resources"文件夹的显式引用。一些例子:
@ContextConfiguration("classpath:/resources/foo/bar.xml")
ApplicationContext context =
new FileSystemXmlApplicationContext("resources/foo/baz.xml");
File file = new File("resources/yaz/blah.gif");
etc...
更改所有引用将花费大量精力(并且由于其他业务规则,代码必须保留在'resource'文件夹中)。我想知道在maven中是否有一种简单的方法来解决文件夹结构的变化。这样,当JUnit测试运行或应用程序通过IDE (Netbeans)启动时,它将正确地解析资源。
换句话说,代码在Ant中工作得很好,但在移动到Maven之后就坏了,因为资源已经移动到不同的文件夹结构。
您的代码应该始终引用构建区域中的文件,而不是源区域中的文件。看起来maven构建并没有完全复制ant构建所做的工作。检查target/classes文件夹(稍后构造jar文件的基础)并查看资源文件位于什么位置。如果错误,操作源目录结构,直到您得到想要的,或者使用pom元素设置正确的- http://maven.apache.org/pom.html#Resources
当你构建战争时,将src/main/resources
直接放入/target/resources
而不是/target
。
本页显示outputDirectory
参数,用于指定资源的输出文件夹。
我觉得应该是这样的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<outputDirectory>${project.build.outputDirectory}/resources</outputDirectory>
</configuration>
</plugin>
基于我所能的是你的源代码错误,因为你引用的资源文件夹是默认值的一部分。
所以通常所有位于src/main/resources
的内容都会在构建过程中被复制到target/classes
,这意味着你需要引用这样的资源:
@ContextConfiguration("classpath:/foo/bar.xml")
ApplicationContext context =
new FileSystemXmlApplicationContext("/foo/baz.xml");
但我不能100%确定以上是否真的有效。据我所知,它只会工作,如果你的资源是通过类路径可用,在情况下,一个jar,其中包含的资源是不正确的。
此外,引用资源作为一个文件是错误的方式,因为如果你的构建结果被打包到一个jar中,你就不能作为一个文件访问资源。你需要通过
InputStream is = this.getClass().resourcesAsStream("/yaz/blah.gif");
but NOT like this
File file = new File("/yaz/blah.gif");
不能工作
如果你真的需要项目的结构,你需要通过构建助手maven插件添加补充资源文件夹,但我建议最好在maven中使用默认布局。