如何让 Maven 将依赖项的资源文件放在父 war 中并注意依赖项 jar
How to make maven put resource files of a dependancy in parent war and not dependancy jar
我有两个项目A和B。
B 依赖于 A.
A有一些资源文件。
在 B 上使用 mvn install
时,它会使用 A.jar 中打包的资源(如之前构建的那样)
我希望将资源打包在 B 中,以便我可以轻松地编辑它们。 (特别是因为 B 被部署为 WAR)
将资源复制到项目 B 可能无济于事,因为 A 中的代码使用以下代码检索信息
InputStream stream = this.getClass().getResourceAsStream(
"/resourceFile.properties");
我需要更改路径以关联到项目 B 吗?如果可以,应该怎么做?
处理此问题的最佳方法是什么?
您可以使用 maven-shade-plugin
的 shade
mojo to repackage select artifacts from your project A
into B
. I haven't entirely looked at the jarjar-maven-plugin
,但它也可以帮助您做到这一点。
请特别查看 shade
插件文档的 "Relocating classes" section 以了解如何操作。理论上它应该与资源文件同样有效。
您的代码将一如既往地工作——加载的资源是在 B
的类路径中还是在 B
中的同一个 jar 或不同的 jar 中并不重要的 WEB-INF/lib
只要它在类路径中并在您的代码中由正确的路径引用。
很高兴您没有考虑将 属性 文件移动到 B
项目的代码库中 - 如果您这样做了,A
将不再是独立的。
只要项目 B 与项目 A 在同一个类路径中,该代码就会继续工作。
不过,使用 ClassLoader.getResoucreAsStream rather than Class.getResourceAsStream 可能更清楚。 Class
上的方法默认查找与 Class
的包名称相关的资源。您提供了绝对路径(以'/'开头),说明不需要包相关逻辑。
我找到的最简单的方法
它将其添加到您的 B 项目 POM
<build>
....
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>../A/src/main/resources</directory>
</resource>
</resources>
...
</build>
我有两个项目A和B。 B 依赖于 A.
A有一些资源文件。
在 B 上使用 mvn install
时,它会使用 A.jar 中打包的资源(如之前构建的那样)
我希望将资源打包在 B 中,以便我可以轻松地编辑它们。 (特别是因为 B 被部署为 WAR)
将资源复制到项目 B 可能无济于事,因为 A 中的代码使用以下代码检索信息
InputStream stream = this.getClass().getResourceAsStream(
"/resourceFile.properties");
我需要更改路径以关联到项目 B 吗?如果可以,应该怎么做?
处理此问题的最佳方法是什么?
您可以使用 maven-shade-plugin
的 shade
mojo to repackage select artifacts from your project A
into B
. I haven't entirely looked at the jarjar-maven-plugin
,但它也可以帮助您做到这一点。
请特别查看 shade
插件文档的 "Relocating classes" section 以了解如何操作。理论上它应该与资源文件同样有效。
您的代码将一如既往地工作——加载的资源是在 B
的类路径中还是在 B
中的同一个 jar 或不同的 jar 中并不重要的 WEB-INF/lib
只要它在类路径中并在您的代码中由正确的路径引用。
很高兴您没有考虑将 属性 文件移动到 B
项目的代码库中 - 如果您这样做了,A
将不再是独立的。
只要项目 B 与项目 A 在同一个类路径中,该代码就会继续工作。
不过,使用 ClassLoader.getResoucreAsStream rather than Class.getResourceAsStream 可能更清楚。 Class
上的方法默认查找与 Class
的包名称相关的资源。您提供了绝对路径(以'/'开头),说明不需要包相关逻辑。
我找到的最简单的方法 它将其添加到您的 B 项目 POM
<build>
....
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>../A/src/main/resources</directory>
</resource>
</resources>
...
</build>