如何让Maven库my-lib强制传递依赖版本至引入它的应用?
问题场景
我熟悉Maven项目(如my-app)强制传递依赖版本的方式,但现在遇到一个问题:作为被其他项目依赖的工具库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>
父工程的BOM导入
为了覆盖Log4j的版本,我在my-lib的父工程my-lib-parent的dependencyManagement中导入了指定版本的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查看my-lib的依赖树,显示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-app后的异常
将my-lib作为依赖加入my-app后,运行代码时出现java.lang.NoClassDefFoundError: org/apache/logging/log4j/BridgeAware错误。查看my-app的依赖树,发现Log4j版本变为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-lib中显式声明的org.apache.logging.log4j:log4j-slf4j2-impl:jar:2.20.0在my-app中保持了正确版本。
疑问
是否必须枚举com.amazonaws:aws-lambda-java-log4j2的所有传递依赖并在my-lib中显式声明,才能让my-app使用指定版本?有没有类似导入BOM的简便方法,让my-lib强制所有Log4j传递依赖的版本给引入它的应用?
内容的提问来源于stack exchange,提问作者Garret Wilson

