log4j 通过库本身强制库的可传递Maven依赖项的版本

fdbelqdn  于 2023-11-18  发布在  Maven
关注(0)|答案(1)|浏览(193)

我很熟悉像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.0my-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”?

0x6upsns

0x6upsns1#

我过去也遇到过这个问题:DependencyManagement不是可传递的。
您可以通过使用flatten Maven插件生成一个“consumer pom”来避免这个问题。

相关问题