遇到的问题:

在开发过程中,我们常常会遇到各种各样的错误,其中一些错误可能由于第三方库的版本不兼容导致。最近我在开发一个 Spring Cloud 项目时遇到了一种异常:
当我点击导出的时候,给我爆这个错误,结果查了一下告诉我是版本的原因

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.logging.log4j.Logger.atDebug()Lorg/apache/logging/log4j/LogBuilder;

 具体错误如下图:

该错误的根本原因是由于 Log4j 的版本不兼容,导致程序在运行时无法找到方法 atDebug()。经过一番排查,我找到了升级 Log4j 版本的解决方案,下面分享一下我的解决过程和思路。 

错误解析 

NoSuchMethodError 是指在运行时 Java 虚拟机无法找到指定方法的错误。根据异常信息中的 org.apache.logging.log4j.Logger.atDebug() 方法,我们可以看到该问题与 Log4j 日志库的版本有关。具体来说,Log4j 2.x 版本支持 Logger.atDebug() 方法,而在项目中使用的版本可能是 1.x 或是一个较旧的版本,导致缺少该方法。 

解决方案

根据 Log4j 官方文档和错误信息,我们可以通过升级 Log4j 到 2.x 版本来解决这个问题。Log4j 2.x 相比 1.x 版本提供了更多的特性和性能优化,并且对现代 Java 项目更加友好。

1. 修改 pom.xml

首先,我们需要在项目的 pom.xml 文件中添加 Log4j 2.x 的依赖。Log4j 2.x 由两个核心组件组成:log4j-apilog4j-core。确保你使用的是 2.x.x 版本,这里以 2.17.1 版本为例:

 如图所示,导入下面的依赖一般情况下应该就可以了。

 

 

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
</dependency>

<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
</dependency>

2. 升级 Spring Boot 的版本(如果需要)一般跟这个没有关系

如果你的项目是基于 Spring Boot 开发的,可能需要确保 Spring Boot 的版本与 Log4j 2.x 兼容。Spring Boot 2.x 默认支持 Log4j 2,因此只需要在 pom.xml 中添加正确的 Log4j 依赖即可。

3. 排除旧版 Log4j 依赖

如果你的项目中使用了旧版本的 Log4j 1.x(比如 log4j-1.x.jar),你需要将它从项目中排除,避免与 Log4j 2.x 版本冲突。可以在 pom.xml 中进行排除:

4. 重建项目并测试

完成依赖添加后,重新构建项目并启动应用程序。如果一切正常,原先的 NoSuchMethodError 错误应该得到解决。

然后我在点击导出就正常了:

总结

通过升级 Log4j 到 2.x 版本,并正确配置相关依赖,我们成功解决了 Spring Cloud 项目中的 NoSuchMethodError 问题。这个问题通常出现在使用了较旧版本的 Log4j 时,Log4j 2.x 提供了更好的性能和更多功能,推荐在新项目中使用。

如果你也遇到类似问题,可以参考上面的解决方案,升级 Log4j 版本,并注意检查项目中是否有旧版的 Log4j 依赖。希望这个总结能对你有所帮助!

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐