新增Spring Boot模块到旧项目出现SLF4J版本不兼容报错如何解决?
问题根源
- 父POM全局锁定了SLF4J系列依赖版本为1.5.6,属于非常老旧的版本
- 新增的Spring Boot 2.6.0默认依赖的SLF4J API版本为1.7.x,和旧版本的SLF4J绑定实现不兼容,触发版本 mismatch 报错,最终抛出
NoSuchMethodError - 之前的排除操作没有统一子模块内所有SLF4J相关依赖的版本,也没有覆盖父POM的全局旧版本传递规则,因此不生效
可行解决方案
优先推荐第一种方案,不会对现有存量模块产生任何影响;如果可以接受小范围回归验证,第二种方案更简洁一劳永逸。
方案1:仅修改新增的muses-projection模块(无侵入)
不需要修改父POM或其他存量模块,仅调整新增模块的pom.xml即可:
- 在Spring Boot Starter依赖中排除默认的logback日志实现,和父POM的log4j日志体系对齐
- 在子模块的依赖管理中指定SLF4J的统一版本,覆盖父POM的旧版本规则
修改后的子模块pom.xml关键部分如下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!-- 排除Spring Boot默认的logback日志实现 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>fr.edu.paris</groupId> <artifactId>muses-service</artifactId> <version>${fr.edu.paris.muses-service}</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.6.0</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 覆盖父POM的旧SLF4J版本,统一为和Spring Boot 2.6适配的1.7.32版本 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.32</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.32</version> </dependency> </dependencies> </dependencyManagement>
方案2:全局升级SLF4J版本(一劳永逸)
SLF4J 1.7.x完全向下兼容1.5.x的API,存量业务代码几乎不会出现兼容性问题,仅需要修改父POM的一行配置:
找到父POM的properties节点,将slf4jLog4j12.version的属性值从1.5.6改为1.7.32即可,改完后所有模块的SLF4J版本都会统一升级,不需要再单独处理新增的Spring Boot模块。
验证方法
修改完成后,在muses-projection模块根目录执行命令:mvn dependency:tree | grep slf4j
检查输出中所有slf4j开头的依赖版本是否完全一致,没有多版本共存即说明配置生效。
注意:请先恢复之前Eclipse工具意外给其他模块添加的排除规则,避免影响存量模块的正常运行。
内容的提问来源于stack exchange,提问作者sushiLover
相关产品推荐
相关产品推荐

