java.lang.AbstractMethodError: org.slf4j.impl.JDK14LoggerAdapter.log(Lorg/slf4j/Marker;Ljava/lang/St

本文介绍了解决Spring框架中因SLF4J不同版本导致的AbstractMethodError错误的方法。通过调整slf4j-api和slf4j-jdk14的版本一致性,确保日志系统的稳定运行。
java.lang.AbstractMethodError: org.slf4j.impl.JDK14LoggerAdapter.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:133)
at org.springframework.core.env.MutablePropertySources.addLast(MutablePropertySources.java:103)
at org.springframework.core.env.StandardEnvironment.customizePropertySources(StandardEnvironment.java:78)
at org.springframework.core.env.AbstractEnvironment.<init>(AbstractEnvironment.java:117)
at org.springframework.core.env.StandardEnvironment.<init>(StandardEnvironment.java:54)
at org.springframework.context.support.AbstractApplicationContext.createEnvironment(AbstractApplicationContext.java:427)
at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:227)
at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:217)
at org.springframework.context.support.GenericApplicationContext.<init>(GenericApplicationContext.java:102)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:96)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:62)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:52)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)


 解决方法:检查jar包是否存在冲突或jar版本是存在不兼容的问题,我的项目中是因为slf4j-api-1.6.2.jar和slf4j-jdk14-1.5.6.jar不兼容问题,将slf4j-jdk14-1.5.6.jar删除,下一个slf4j-jdk14-1.6.2.jar放在lib目录下,问题解决,slf4j-jdk14下载地址

ref:http://blog.youkuaiyun.com/tangyajun_168/article/details/8107815


而在我的项目里,发现导入了两个不同版本的slf4j-api-xxx.jar , 总之,不冲突即可。


### 解决 `java.lang.AbstractMethodError` 错误并设置断点 #### 问题分析 `java.lang.AbstractMethodError` 是一个运行时异常,通常发生在调用了一个未被具体实现的抽象方法时。对于 `org.slf4j.simple.SimpleServiceProvider.getRequestedApiVersion` 方法,该错误可能表明以下情况之一: - 使用的 SLF4J 版本不兼容。 - 类加载器加载了错误版本的类[^1]。 - 在运行时加载的类与编译时使用的类版本不同。 #### 解决方案 ##### 1. 检查 SLF4J 版本兼容性 确保项目中使用的 SLF4J 版本与依赖库的版本一致。如果存在多个版本的 SLF4J 库(例如通过 Maven 或 Gradle 引入),可能会导致类加载冲突。使用以下命令检查依赖树以确认是否存在冲突: ```bash # 对于 Maven mvn dependency:tree # 对于 Gradle gradle dependencies ``` 如果发现多个版本的 SLF4J 库,请排除不必要的依赖或强制指定单一版本[^2]。 ##### 2. 验证类加载器行为 类加载器可能加载了错误版本的 `SimpleServiceProvider` 类。可以通过以下代码打印类的加载路径来验证: ```java System.out.println(SimpleServiceProvider.class.getResource("SimpleServiceProvider.class")); ``` 如果输出路径与预期不符,说明类加载器加载了错误版本的类。需要检查类路径配置或清理缓存[^3]。 ##### 3. 确保方法已实现 `getRequestedApiVersion` 方法在某些 SLF4J 实现中可能是抽象方法。如果使用的是自定义实现或旧版本的 SLF4J,可能需要手动实现该方法。例如: ```java package org.slf4j.simple; public class CustomSimpleServiceProvider extends SimpleServiceProvider { @Override public String getRequestedApiVersion() { return "1.7"; // 返回期望的 API 版本 } } ``` 然后在代码中使用自定义实现替代默认实现[^4]。 #### 设置断点 ##### 使用 IDE 设置断点 在 IDE 中打开 `SimpleServiceProvider` 类并找到 `getRequestedApiVersion` 方法。在方法的第一行代码旁边单击以设置断点。启动调试模式后,程序将在调用该方法时暂停,允许检查变量和调用堆栈[^5]。 ##### 使用 JDB 设置断点 如果无法使用 IDE,可以借助命令行工具 JDB 设置断点。启动 JDB 并附加到 JVM 后,使用以下命令为方法设置断点: ```bash stop in org.slf4j.simple.SimpleServiceProvider.getRequestedApiVersion ``` 继续执行程序时,当调用 `getRequestedApiVersion` 方法时将暂停运行[^6]。 #### 示例代码 以下是一个简单的示例,展示如何验证和替换 `SimpleServiceProvider` 的实现: ```java import org.slf4j.simple.SimpleServiceProvider; public class Main { public static void main(String[] args) { try { System.out.println("SLF4J API Version: " + new CustomSimpleServiceProvider().getRequestedApiVersion()); } catch (AbstractMethodError e) { System.err.println("AbstractMethodError occurred: " + e.getMessage()); } } } class CustomSimpleServiceProvider extends SimpleServiceProvider { @Override public String getRequestedApiVersion() { return "1.7"; } } ``` #### 注意事项 - 确保所有依赖库的版本一致,避免类加载冲突。 - 如果问题仍然存在,尝试清理项目的构建缓存并重新构建项目。 - 在生产环境中避免直接修改第三方库的源码,建议通过扩展或代理方式实现自定义逻辑。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值