Eclipse中Maven项目配置Struts和Hibernate后遇NoSuchMethodError错误求助
这个问题我之前帮好几个开发者解决过,本质就是log4j的依赖版本冲突搞的鬼——你的项目里同时混了不同版本的log4j相关jar包,比如旧版本的log4j-core和新版本的log4j-api(反过来也有可能),而getThreadContextMap()这个方法是在较新的log4j 2.x版本里才新增的,旧版本根本没有这个方法,代码调用时自然就抛出错误了。
咱们一步步来解决:
第一步:揪出冲突的依赖包
在Eclipse里打开Maven视图,找到你的项目,右键选Run As->Maven build...,在Goals框里输入dependency:tree,点击Run。这会输出项目所有依赖的层级树,你重点找包含log4j-core或log4j-api的条目,看看是不是有不同版本重复出现。第二步:排除掉冲突的低版本依赖
找到引入旧版本log4j的那个依赖(大概率是Struts或者Hibernate自带的),在你的pom.xml里给这个依赖加上<exclusions>标签,把旧的log4j包排除掉。比如如果是Struts带进来的旧log4j:<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts-core</artifactId> <version>你的Struts版本号</version> <exclusions> <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>第三步:统一指定log4j版本
在pom.xml的<dependencyManagement>区块里,明确指定log4j-core和log4j-api的统一稳定版本,确保整个项目都用同一个版本:<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> <!-- 可以选最新的稳定版,比如2.20.0也行 --> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.1</version> </dependency> </dependencies> </dependencyManagement>第四步:清理重建项目
右键项目选Maven->Clean,等清理完再选Maven->Install,让Maven重新下载并替换正确的依赖包。
最后提个醒:别同时引入log4j 1.x和log4j 2.x的包,这俩API差异巨大,绝对会出问题;另外如果还有其他第三方依赖,也要检查它们有没有带进来不同版本的log4j,逐一排除就行。
内容的提问来源于stack exchange,提问作者Saad Ouazani

