升级Log4j至2.17.1后仍下载2.12.1的bom包,如何阻止?
解决Spring Boot构建时下载Log4j 2.12.1 BOM的问题
问题根源
Spring Boot 2.2.6.RELEASE的spring-boot-starter-parent在其dependencyManagement中通过${log4j2.version}属性导入了Log4j 2.12.1的BOM。尽管你在子项目中覆盖了log4j2.version属性并导入了2.17.1的BOM,但Maven在解析父pom时仍可能尝试拉取旧版本BOM,或是存在其他依赖间接引入了旧版本BOM,导致被infra的下载限制拦截。
可行解决方案
1. 调整BOM导入优先级
确保子项目的dependencyManagement中优先导入Log4j 2.17.1的BOM,将其放在dependencyManagement的最顶部,确保解析时优先覆盖父pom的旧版本配置:
<dependencyManagement> <dependencies> <!-- 优先导入新版本BOM,覆盖父pom的旧版本 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-bom</artifactId> <version>2.17.1</version> <scope>import</scope> <type>pom</type> </dependency> <!-- 其他dependencyManagement配置 --> </dependencies> </dependencyManagement>
2. 放弃BOM,直接指定依赖版本
如果导入BOM仍无法阻止旧版本下载,可以直接在dependencyManagement中逐个指定Log4j相关依赖的版本,避免Maven拉取任何BOM文件:
<properties> <java.version>11</java.version> <log4j2.version>2.17.1</log4j2.version> </properties> <dependencyManagement> <dependencies> <!-- 显式指定所有Log4j核心依赖版本 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j2.version}</version> </dependency> <!-- 根据实际使用添加其他Log4j依赖(如log4j-web) --> </dependencies> </dependencyManagement>
3. 用Enforcer插件拦截旧版本
配置maven-enforcer-plugin强制禁止使用Log4j 2.12.1版本,从构建层面拦截旧版本的下载和使用:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>3.0.0-M3</version> <executions> <execution> <id>block-old-log4j</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <bannedDependencies> <excludes> <exclude>org.apache.logging.log4j:*:2.12.1</exclude> <exclude>org.apache.logging.log4j:log4j-bom:2.12.1</exclude> </excludes> <message>禁止使用Log4j 2.12.1版本,请切换至2.17.1</message> </bannedDependencies> </rules> </configuration> </execution> </executions> </plugin> <!-- 其他构建插件 --> </plugins> </build>
4. 排查间接引入的旧BOM
执行mvn dependency:tree -Dverbose命令,查看依赖树中是否有其他依赖的pom导入了Log4j 2.12.1的BOM。若存在,可通过子项目的dependencyManagement显式覆盖对应依赖的版本,或调整依赖排除规则。
内容的提问来源于stack exchange,提问作者Shail
相关产品推荐
相关产品推荐

