1

我正在尝试将现有项目从 Ant 项目迁移到 Maven 项目。Ant 项目的结构如下:

|-root
|---resources
|------foo
|------yaz
|---src
|------SomeFile.java

Maven项目的结构为

|-root
|---src
|------main
|---------java
|------------SomeFile.java
|------test
|---------resources
|------------foo
|------------yaz

不幸的是,代码中有很多对“资源”文件夹的显式引用。一些例子:

@ContextConfiguration("classpath:/resources/foo/bar.xml")

ApplicationContext context = 
   new FileSystemXmlApplicationContext("resources/foo/baz.xml");

File file = new File("resources/yaz/blah.gif");

etc...

更改所有引用将花费大量精力(并且由于其他业务规则,代码必须保留在“资源”文件夹中)。我想知道 Maven 中是否有一种简单的方法来解决文件夹结构的变化。这样,当 JUnit 测试运行或通过 IDE (Netbeans) 启动应用程序时,它将正确解析资源。

换句话说,代码在 Ant 中运行良好,但在移动到 Maven 后由于资源已移动到不同的文件夹结构而中断。

4

3 回答 3

1

您的代码应始终引用构建区域中的文件,而不是源区域。看来您的 Maven 构建并没有完全复制 ant 构建正在做的事情。检查 target/classses 文件夹(稍后构建 jar 文件的基础)并查看资源文件的位置。如果错了,要么操纵源目录结构,直到你得到你想要的,要么使用 pom 元素来设置正确的 - http://maven.apache.org/pom.html#Resources

于 2013-06-04T06:36:13.433 回答
1

当你建立战争时,投入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>
于 2013-06-03T18:50:38.567 回答
1

根据我所能做的,您的源代码错误,因为您正在引用作为默认值一部分的资源文件夹。

因此,通常位于 int 的所有内容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 插件添加补充资源文件夹,但我建议最好使用 Maven 中的默认布局。

于 2013-06-04T07:10:54.027 回答