为了使示例尽可能简单,假设我有经典的 Java EE 5 应用程序。
假设我在 EAR 模块中使用 x-lib
,而 x-lib
使用 commons-io
。
另外,我在 WAR 模块中使用了 y-lib
,而 y-lib
也使用了 commons-io
。
EAR 在 WAR 中设置为提供。
我得到的结果是:
- app.ear
/lib
x-lib.jar
commons-io.jar
/app.war
/WEB-INF
/lib
y-lib.jar
commons-io.jar
我不希望将 commons-io 打包到 app.war/WEB-INF/lib
中,一旦它已经打包到 app.ear/lib
中。
在我的 war 的 pom.xml 中我有:
<dependency>
<groupId>my.group</groupId>
<artifactId>app</artifactId>
<type>ejb</artifact>
<scope>provided</scope>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>some.other.group</groupId>
<artifactId>y-lib</artifactId> <!-- This loads commons-io as compile dependency -->
<version>1.2.3</version>
</dependency>
有没有办法告诉 Maven 我希望随应用程序 ejb 依赖项一起提供的所有内容都应设置为提供而不包含在 WAR 中?
我不想跟踪所有这些重复的 JAR 并将它们设置为已提供或明确地一一排除。
编辑
我知道 skinny-war 解决方案。然而,我不喜欢在 WAR 和 EAR 中重复依赖关系的 drwaback。也许您知道如何克服这个问题。
最佳答案
从 maven-ear-plugin
2.7 版本开始,您可以使用 SkinnyWars。
请参阅此处了解规范:https://maven.apache.org/plugins/maven-ear-plugin/examples/skinny-wars.html
基本上,您可以将 skinnyWars
标签添加到您的插件配置中:
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<defaultLibBundleDir>lib/</defaultLibBundleDir>
<skinnyWars>true</skinnyWars>
</configuration>
</plugin>
关于java - 如何使用 Maven 避免 EAR/WAR 中派生依赖项的重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13622365/