如何避免使用Maven在EAR / WAR中重复派生的依赖项?

时间:2012-11-29 09:16:20

标签: java java-ee maven

为了使示例尽可能简单,假设我有经典的Java EE 5应用程序 假设我在EAR模块中使用x-libx-lib使用commons-io
我在WAR模块中使用y-liby-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。也许你知道如何克服这一点。

4 个答案:

答案 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>