更新 pom.xml 中子依赖项的版本

Posted

技术标签:

【中文标题】更新 pom.xml 中子依赖项的版本【英文标题】:Update version of child dependency in pom.xml 【发布时间】:2022-01-22 00:25:36 【问题描述】:

在我的 Spring Boot 应用程序中,我使用的是 log4j2

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

默认选择哪个版本-

<version>2.1.6.RELEASE</version>

这个版本的log4j2内部使用log4j

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.11.2</version>
  <scope>compile</scope>
</dependency>

最近宣布 - log4j 在版本 2.16 之前存在一些严重漏洞。

到目前为止还没有log4j2 的版本使用更安全的版本 - 2.17 of log4j

所以我想首先尝试更新我的 pom 以使用 log4j2.17 版本而不更改父 log4j2 版本。

我知道它可能不起作用并且可能会出现编译问题,但我仍然想先尝试一下。

我该怎么做?

【问题讨论】:

首先你为什么使用旧的 spring boot 版本?此外定义一个新版本的 log4j-core 像 2.17.0 【参考方案1】:

我建议通过 bom 文件定义 log4j,如下所示:

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-bom</artifactId>
    <version>2.17.0</version>
    <scope>import</scope>
    <type>pom</type>
  </dependency>

【讨论】:

【参考方案2】:

你可以使用&lt;dependencyManagement&gt;:

<dependencyManagement>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
       <version>[2.17.0,)</version>
    </dependency>
</dependencyManagement>

这会将依赖项 log4j-core(如果存在)配置为使用 2.17 或更高版本(请参阅 Version Range References)。

dependencyManagement 部分放在您的dependencies 部分旁边。

【讨论】:

不要使用版本范围...只需将新版本写入其中... 目的是强制至少那个版本。如果没有使用版本,maven 的版本解析可以使用旧版本。如果使用了版本范围并且无法解决,则构建将失败(比漏洞好)。 该分辨率不会单独使用旧版本。仅当将一个版本定义为目录或传递依赖项时。如果根本没有使用/定义任何版本,则不会解决依赖关系。这是对解析机制的滥用如果你想阻止特定版本使用 Maven Enforcer Plugin 和适当的强制规则... 为什么会误用解析机制?如果某些项目需要,则存在版本范围以指定依赖项的最小和最大版本。由于该项目至少需要该版本才能正常工作(没有安全问题),这似乎是一个不错的选择。 但不是为了识别依赖需求...

以上是关于更新 pom.xml 中子依赖项的版本的主要内容,如果未能解决你的问题,请参考以下文章

在 maven pom.xml 中更改传递依赖项的版本

如何解析使用动态版本的依赖项的父 POM

为啥有排除 pom.xml / maven 中依赖项的依赖项的选项?

怎么把jar包加入到maven dependencies

Maven配置私有库

Maven配置私有库