无法确定Maven为何自动下载log4j-api:2.1版本的问题咨询
这种情况我之前踩过好几次坑,明明项目里指定了2.8.1版本,dependency:tree也查不到2.1的痕迹,但Maven就是要偷偷下载旧版本,大概率是插件依赖或者隐式的依赖管控在搞鬼,给你几个具体的排查和解决方向:
检查Maven插件的隐藏依赖:
默认的mvn dependency:tree只会展示项目本身的依赖,不会包含Maven插件(比如compiler、surefire、maven-war-plugin这些)的依赖。有些插件可能内部依赖了log4j-api:2.1,你可以用这个命令查看所有包含log4j-api的依赖,包括插件的:mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-api要是看到某个插件下面挂着2.1版本,就知道问题出在哪了。
查看生效的POM配置:
你的项目可能继承了父POM,或者在dependencyManagement节点里有被覆盖的版本配置。执行下面的命令生成实际生效的POM,然后搜索log4j-api:mvn help:effective-pom > effective-pom.xml打开生成的文件看看,有没有地方强制指定了2.1版本,尤其是
dependencyManagement里的配置,优先级比你自己在dependencies里写的更高。检查激活的Profile:
有些项目会在不同的Profile里配置不同的依赖版本,可能你当前激活的Profile里藏着2.1的配置。先看看当前激活了哪些Profile:mvn help:active-profiles然后去对应Profile的配置里找找log4j-api的版本声明。
强制刷新依赖缓存:
有时候本地Maven缓存的元数据出问题了,就算删了.m2里的目录也没用。试试加-U参数强制更新所有依赖的快照和元数据:mvn clean install -U
快速解决办法
如果暂时找不到根源,可以在项目的dependencyManagement里明确锁定log4j-api的版本,这样所有依赖(包括插件的)都会强制使用你指定的2.8.1:
<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.1</version> </dependency> </dependencies> </dependencyManagement>
内容的提问来源于stack exchange,提问作者wxkevin

