我正在尝试将现有项目从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后因为资源已移动到不同的文件夹结构而中断。
答案 0 :(得分:1)
当您制造战争时,请将src/main/resources
直接放入/target/resources
而不是/target
。
THIS PAGE显示outputDirectory
参数,该参数指定资源的输出文件夹。
我认为它看起来像这样:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<outputDirectory>${project.build.outputDirectory}/resources</outputDirectory>
</configuration>
</plugin>
答案 1 :(得分:1)
您的代码应始终引用构建区域中的文件,而不是源区域。看来你的maven构建并不能完全复制ant build正在做的事情。检查target / classses文件夹(稍后构建jar文件的基础)并查看资源文件的位置。如果错误,要么操纵源目录结构,直到得到你想要的结果,要么使用pom元素设置正确 - http://maven.apache.org/pom.html#Resources
答案 2 :(得分:1)
基于我的可能是您的源代码错误,因为您引用的资源文件夹是默认值的一部分。
因此,通常在构建期间将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");
但不喜欢这样:
File file = new File("/yaz/blah.gif");
哪个不起作用。
如果你真的需要使用项目的结构,你需要通过build helper maven plugin添加补充资源文件夹,但我建议更好地使用Maven中的默认布局。