我很熟悉像my-app
这样的Maven项目是如何强制传递依赖的版本的。今天我偶然遇到了一个相关的问题:一个库my-lib
如何在不直接包含传递依赖的情况下强制其与my-app
相关的传递依赖的版本?
我有一个my-lib
库,它的唯一目的是让其他项目可以轻松地同时包含几个传递依赖项-换句话说,my-lib
有点像捆绑机制。在my-lib/pom.xml
中,我正式声明com.amazonaws:aws-lambda-java-log4j2:1.5.1
,然后使用它:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-log4j2</artifactId>
<version>1.5.1</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-log4j2</artifactId>
</dependency>
</dependencies>
字符串
但是我想覆盖正在使用的Log4j的版本,所以在my-lib-parent
中我导入了一个特定的Log4j BOM版本:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-bom</artifactId>
<version>2.20.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
<dependencyManagement>
型
可以肯定的是,如果我在my-lib
上执行mvn dependency:tree
,它会显示正在使用Log4j 2.20.0:
[INFO] +- com.amazonaws:aws-lambda-java-log4j2:jar:1.5.1:compile
[INFO] | +- org.apache.logging.log4j:log4j-core:jar:2.20.0:compile
[INFO] | \- org.apache.logging.log4j:log4j-api:jar:2.20.0:compile
型
所以我很高兴地将my-lib
作为依赖项添加到my-app
中。当我的代码试图记录信息时,我得到了一个java.lang.NoClassDefFoundError: org/apache/logging/log4j/BridgeAware
。事实证明,即使my-lib
项目正在使用org.apache.logging.log4j:log4j-core:jar:2.20.0
,这也只是与my-lib
本身有关-它不会影响my-lib
引入的传递依赖项的版本,就my-app
而言,当my-app
包含my-lib
作为依赖项时!
因此,如果我在my-app
上执行mvn dependency:tree
,则表明正在使用org.apache.logging.log4j:log4j-api:jar:2.17.1
:
[INFO] | +- com.amazonaws:aws-lambda-java-log4j2:jar:1.5.1:provided
[INFO] | | +- org.apache.logging.log4j:log4j-core:jar:2.17.1:provided
[INFO] | | \- org.apache.logging.log4j:log4j-api:jar:2.17.1:provided
型
我想这是有道理的,但坦率地说,我从来没有考虑过这个问题,我只是假设my-app
将获得my-lib
中依赖项管理设置的传递依赖项版本。
我注意到org.apache.logging.log4j:log4j-slf4j2-impl:jar:2.20.0
在my-app
中获得了正确的版本,my-app
也通过Log4j BOM进入了my-lib
,但这似乎是因为my-lib
显式地将org.apache.logging.log4j:log4j-slf4j2-impl:jar:2.20.0
作为其直接依赖项。
那么这是唯一的解决方案吗:如果我想在my-lib
包含在另一个项目中时将它们设置为另一个版本,我是否必须找到并枚举com.amazonaws:aws-lambda-java-log4j2
的所有可传递依赖项,并在my-lib
中显式声明它们?有没有更简单的方法,类似于导入BOM,这将允许my-lib
简单地说“当my-lib
包含在另一个项目中时,强制所有可传递的Log4j版本到Log4j BOM”?
1条答案
按热度按时间0x6upsns1#
我过去也遇到过这个问题:DependencyManagement不是可传递的。
您可以通过使用flatten Maven插件生成一个“consumer pom”来避免这个问题。