最近受log4j2的漏洞的影响,全网码农开始升级log4j2。我这里的服务也需要升级,但是我遇到了一个问题:修改依赖之后发现版本号没有变化。
一、依赖现状
项目A依赖了一个common包,common包里面依赖log4j2
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.exmaple.foundation</groupId>
<artifactId>common</artifactId>
<version>${common.version}</version>
</dependency>
...
</dependencies>
common包依赖修改:
<dependencies>
<dependency>
<groupId>com.example.mq</groupId>
<artifactId>producer-sdk</artifactId>
<version>2.0.5-SNAPSHOT</version>
<!-- 排除旧版本log4j2 -->
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入新版本log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.15.0</version>
</dependency>
...
</dependencies>
本以为这样是可以生效的,但实际并没有生效。后来查阅maven依赖关系,发现有以下原因:
1)dependencyManagement优先级要高于dependencies中的
2)spring-boot-dependencies依赖log4j2,版本是2.10.0
3)spring-boot-dependencies放到了dependencyManagement,所以最终使用的版本是2.10.0
这是根因,既然知道了根因,那就好解决了,通过spring官网获得最终解决方案
二、官方修改建议
通过查看spring官方修改意见,如下图示:
Log4J2 Vulnerability and Spring Boot
按照springboot官方提出的修改意见,最终生效。
三、总结
maven依赖很少出现问题,但是真出问题了还是挺难弄的。这个问题困惑了一天,才最终解决。特地写一篇博客记录下:dependencyManagement的优先级要高于dependencies