3

为了使示例尽可能简单,假设我有经典的 Java EE 5 应用程序。
假设我x-lib在 EAR 模块中使用,并x-lib使用commons-io.
y-lib也在 WAR 模块中使用,并且也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-ioapp.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 我希望与应用程序 ejb 依赖项一起提供的所有内容都应该设置为提供而不包含在 WAR 中?

我不想跟踪所有那些重复的 JAR 并将它们设置为提供或明确排除。

编辑

我知道瘦身战解决方案。但是我不喜欢在 WAR 和 EAR 中复制依赖项的 drwaback。也许你知道如何克服这一点。

4

4 回答 4

1

从 2.7 版开始maven-ear-plugin,您可以使用 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>
于 2016-05-05T15:32:44.633 回答
0

有没有办法告诉 maven 我希望与应用程序 ejb 依赖项一起提供的所有内容都应该设置为提供而不包含在 WAR 中?

在这种情况下,现在最好的选择是在依赖排除中使用通配符。它仅在 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 客户端声明依赖项时,您可以使用相同的策略。

根据您的 maven 3 版本,您会收到一个讨厌的警告,但在较新的版本中它一定没问题。

于 2014-08-20T14:38:46.370 回答
0

如果您将 EJB 模块作为提供的依赖项添加到您的 war 模块并让该 EJB 的所有依赖项传递过来,那么这应该是自动的。所以不要将重叠的依赖项添加到你的war pom中,让Maven来处理它。

于 2012-11-29T09:53:30.620 回答
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>
于 2012-11-29T09:21:14.253 回答