解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level

本文记录了一次SpringBoot版本升级后遇到的java.lang.NoClassDefFoundError异常,详细介绍了问题的原因及解决过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在spring boot开发写代码的时候碰到了一个问题,启动应用报错:java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
之前使用spring boot 1.4.2开发正常 当升级到1.5.7后启动报错。

这里通过idea的ctrl+N定位所在Level类存在于 logback-classic-1.1.11.jar 中,该类确实存在包中,也检查了下maven的依赖确实不存在依赖冲突情况。

当对Level使用idea反编译查看时候却发现里面是空的。当查看本地包的用压缩工具开发时候,查看对应class文件是正常。这里怀疑是下载包存在读写问题(maven的包经常由于读写问题查看一些报错,打不开jar包 或者 class读写不行)。
这里把本地的jar包删除,重新更新项目,拉去新的依赖后重启没有发现此报错。

相信很多人碰到过同类问题,分享一下我自己的解决过程,仅供参考。

SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/Users/hujiangteng/Documents/workdata/xdf/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/Users/hujiangteng/Documents/workdata/xdf/repository/ch/qos/logback/logback-classic/1.2.11/logback-classic-1.2.11.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationListener : org.springframework.boot.context.config.ConfigFileApplicationListener at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:438) at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:420) at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:413) at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:270) at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:250) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203) at com.koolearn.old.manageorder.ApplicationStarter.main(ApplicationStarter.java:33) Caused by: java.lang.NoClassDefFoundError: org/springframework/core/ResolvableType at org.springframework.boot.context.properties.bind.Bindable.of(Bindable.java:202) at org.springframework.boot.context.config.ConfigFileApplicationListener.<clinit>(ConfigFileApplicationListener.java:116) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingC
最新发布
03-21
### 解决SLF4J多绑定问题及Spring Boot启动异常 在处理SLF4J的多个绑定问题时,核心在于确保类路径上仅存在一个有效的SLF4J绑定。如果存在多个绑定,则可能导致冲突并引发诸如`java.lang.IllegalArgumentException`之类的运行时错误。 #### 1. **分析SLF4J Multiple Bindings Issue** 当类路径上有多个SLF4J绑定(例如 `slf4j-log4j12.jar`, `slf4j-jdk14.jar`, 或者 `logback-classic.jar`),SLF4J会发出警告消息:“Multiple bindings were found on the classpath”。这是因为SLF4J设计为每次只允许加载一个具体的日志实现[^1]。为了避免此类问题,应移除多余的绑定文件,并保留唯一的绑定。 对于Spring Boot项目而言,默认情况下它集成了Logback作为其默认的日志框架。因此,在大多数场景下无需额外引入其他日志绑定库(如Log4j)。然而,如果有第三方依赖项意外地引入了另一个SLF4J绑定(比如通过传递性依赖关系导入了`log4j-slf4j-impl`),则可能会导致上述问题的发生[^4]。 #### 2. **排查多余依赖** 为了确认哪些依赖项可能带来了不必要的SLF4J绑定,可以执行Maven命令来查看完整的依赖树: ```bash mvn dependency:tree ``` 此操作可以帮助识别是否存在重复或不必要版本的日志绑定组件。一旦发现冗余条目,可以通过修改POM文件排除这些不需要的部分。例如,假设某个外部模块包含了与当前配置相冲突的日志支持包,则可以在该模块定义处添加如下片段以阻止其传播至最终构建产物之中: ```xml <dependency> <groupId>com.example</groupId> <artifactId>somelib</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency> ``` 这样做的目的是防止因不同类型的日志记录器共存而导致的功能紊乱或者性能下降等问题出现。 #### 3. **调整Spring Boot应用中的日志设置** 针对Spring Boot应用程序来说,通常推荐让其自动管理内部所使用的具体日志实现方式——即继续沿用内置好的Logback方案即可满足大部分需求;但如果确实有必要切换成另一种形式的话(譬如说迁移到Log4j),那么就需要按照官方文档指导完成相应更改过程[^3]: - 替换掉原有的Logback相关制品坐标; - 添加新的目标日志系统的适配层(`slf4j-log4j12`)及其实际执行体(log4j-core)等必要的构件集合。 值得注意的是,在实施以上变更之前最好先备份好现有工程结构以防万一出现问题难以回滚恢复原状。 另外需要注意的一点是关于`ConfigFileApplicationListener`和`ResolvableType`引起的`NoClassDefFoundError`异常情况。这类错误往往是因为某些特定条件下反射机制未能成功解析指定类型造成的。虽然表面上看似乎跟前面提到过的日志子系统有关联,但实际上更可能是由于缺少某些关键类或者是方法签名改变等原因引起的结果。所以除了修正潜在的日志冲突之外还需要仔细检查整个项目的编译环境一致性以及所有涉及反射调用的地方是否有遗漏更新之处。 最后提醒一点就是务必保持各个组成部分之间版本号匹配良好以免因为细微差异而触发意想不到的行为表现出来。 ```python # 示例代码展示如何动态加载不同的日志配置文件 import org.slf4j.LoggerFactory; public class LoggingExample { public static void main(String[] args){ Logger logger = LoggerFactory.getLogger(LoggingExample.class); // 假设这里可以根据某种条件决定采用哪个日志级别 String levelCondition="DEBUG"; switch(levelCondition.toUpperCase()){ case "INFO": ((ch.qos.logback.classic.Logger)logger).setLevel(Level.INFO); break; default : ((ch.qos.logback.classic.Logger)logger).setLevel(Level.DEBUG);break; } logger.debug("This is a debug message."); logger.info("This is an info message."); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值