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

标签 java jakarta-ee maven

为了使示例尽可能简单,假设我有经典的 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/

相关文章:

java - 将基本身份验证从 java 转换为 dart

java - 将 Twitter 数据从 Java 插入到 MySQL

java - appengine 数据存储区查询转义单引号 (')

jakarta-ee - 如何更改cPanel上运行tomcat的默认端口并去掉地址上的app名称

jakarta-ee - 无法加载类 - JDBC

java - 将 Spring boot war 部署到 Tomcat 8

java - 设置 png 的 "window level"(从 DICOM 转换而来)

java - Maven:无法在项目上执行目标。 Hibernate 5 从 repo.spring.io 消失了?

spring - 使用Spring Boot将实现(例如Hibernate Validator)添加到类路径错误中

java - 为什么我们在匿名内部类中使用 final 关键字?