SpringBoot 2.2.0 - 2.6.3 貌似一直默认使用的 log4j-api 2.12.1
但这次碰到个奇怪的需求,需要的库使用的 log4j-api 为 2.17.1
从而导致了运行时的BUG:
java.lang.NoSuchMethodError:
org.apache.logging.log4j.Logger.atDebug()L
org/apache/logging/log4j/LogBuilder;
新版的库找不到对应的方法,
但又因为 Maven POM 文件中,SpringBoot 的依赖是直接装配在了 parent 段落中:
<parent>
<groupId>org.springframework.boot</groupId>
<version>2.2.0.RELEASE</version>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
也就是说它作为一个 dependencies 版本不匹配的 BUG,
又没法在 POM 的 dependencies 段落中去修复版本不匹配的问题,太奇葩了。
结果。在一个个比对依赖库版本后,最终才把问题定位在了 parent 段落里。
于是着手开始修复:
- 根据官方文档,我们把 parent 整节替换为 dependencyManagement,这样腾出你项目 parent 的位置,以后还能留给公司去用
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后在 <dependencies>
中插入你想要覆写的SpringBoot的依赖库和对应版本号
最终成品如下:
<dependencyManagement>
<dependencies>
<!-- Override LOG4J-API VERSION provided by Spring Boot -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
但要注意的是,IDEA中更新Maven的POM文件以后,最好 Ctrl+Alt+Shift+S
在 Libraries 中清空一下当前的依赖缓存,再刷新一次POM文件。
最后,必须确保你 Project External Libraries 中对应库的版本号正确才行。
参照官方文档:
https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/