maven可以解析文件夹结构发生变化的本地资源吗?

时间:2013-06-03 18:40:09

标签: java maven netbeans

我正在尝试将现有项目从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后因为资源已移动到不同的文件夹结构而中断。

3 个答案:

答案 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中的默认布局。