为了使示例尽可能简单,假设我有经典的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
中。
在我的战争的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我希望提供的所有内容与app ejb依赖项一起设置为提供且不包含在WAR中?
我不想跟踪所有重复的JAR,并将它们按照提供的方式设置或逐个显式排除。
修改的
我知道瘦身战争的解决方案。但是我不喜欢在WAR和EAR中重复依赖的drwaback。也许你知道如何克服这一点。
答案 0 :(得分:0)
您需要添加如下排除:
<dependency>
<groupId>some.other.group</groupId>
<artifactId>y-lib</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
</exclusions>
</dependency>
答案 1 :(得分:0)
如果将EJB模块作为提供的依赖项添加到war模块并且允许该EJB的所有依赖项传递,那么该应该是自动的。因此,不要将重叠的依赖项添加到war pom中,只需让Maven处理它。
答案 2 :(得分:0)
有没有办法告诉maven我想要提供的所有内容 与app ejb相关应该设置为提供而不是 包括在WAR?
在这种情况下,认为现在最好的选择是使用wilcards in dependency exclusion。 它仅在maven 3中受支持。
以下是如何从war项目声明ejbmodule依赖项的示例:
<dependency>
<groupId>ejbModuleGroupId</groupId>
<artifactId>ejbModuleArtifactId</artifactId>
<scope>provided</scope>
<type>ejb</type>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
在声明对ejb-client的依赖时,可以使用相同的策略。
根据您的maven 3版本,您将获得nasty warning,但在较新的版本中,它必须没问题。
答案 3 :(得分:0)
从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>