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

Posted

技术标签:

【中文标题】maven可以解析文件夹结构发生变化的本地资源吗?【英文标题】:Can maven resolve local resources whose folder structure changed? 【发布时间】:2013-06-03 18:40:09 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢,这正是我想要的!【参考方案2】:

构建战争时,将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>

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于maven可以解析文件夹结构发生变化的本地资源吗?的主要内容,如果未能解决你的问题,请参考以下文章

intellij idea解析本地maven仓库无效是为啥

Java开发学习----Maven聚合和继承解析

键入网址,按回车,发生了什么

maven项目 pom.xml文件解析

SSM框架MyBatis笔记 --- 三层架构;MyBatis框架结构;MyBatis 核心配置文件;sql 映射文件;MyBatis 使用初步(通过Maven添加依赖)

Spring Boot 2 Maven 目录视图解析器