Spring JCL与commons-logging.jar冲突排查求助
解决Spring 6.1.5 + Java 17下Spring-JCL与Commons Logging冲突问题
问题根源分析
你遇到的报错是因为Spring-JCL(Spring的日志适配层)检测到类路径中存在Commons Logging的发现机制,但通过mvn dependency:tree未找到显式依赖,大概率是第三方依赖内置了Commons Logging类,或是你对spring-jcl的排除方式错误导致适配逻辑异常。
具体修复步骤
1. 恢复spring-core对spring-jcl的依赖
你当前在spring-core中排除了spring-jcl,这是错误的。Spring 6的spring-jcl是日志适配核心,会自动优先适配SLF4J,无需排除。移除该排除规则:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> <!-- 移除以下exclusions块 --> <!-- <exclusions> <exclusion> <groupId>spring-jcl</groupId> <artifactId>spring-jcl</artifactId> </exclusion> </exclusions> --> </dependency>
2. 全局排除所有Commons Logging依赖
在dependencyManagement中添加全局排除,确保任何第三方依赖引入的commons-logging都被拦截:
<dependencyManagement> <dependencies> <!-- 新增全局排除commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> <scope>provided</scope> <!-- 标记为provided,避免被引入 --> </dependency> <!-- 你的其他依赖... --> </dependencies> </dependencyManagement>
也可以在特定依赖中显式排除,比如旧版本的axis:
<dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
3. 确保jcl-over-slf4j的加载优先级
在pom.xml的<dependencies>节点(而非dependencyManagement)中显式声明jcl-over-slf4j,让它在类路径中优先加载:
<dependencies> <!-- 显式声明,确保优先生效 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.36</version> </dependency> <!-- 你的其他依赖... --> </dependencies>
4. 可选:直接切换到SLF4J API(彻底规避JCL问题)
将代码中的Commons Logging API替换为SLF4J,从根源上绕过JCL适配逻辑:
// 替换原有导入 import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static Logger log = LoggerFactory.getLogger(BaseBatchProcess.class);
验证修复
执行以下命令清理并重新构建项目,确保依赖生效:
mvn clean install -U
启动项目后检查日志,确认报错消失。
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

