Gradle环境下Neo4j Test Harness 2025.04.0多SLF4J提供者冲突问题
问题背景
- 技术栈:SpringBoot 3.5.0、Spring Data Neo4j 7.5.0,测试依赖Neo4j Test Harness 2025.04.0
- 启动测试时触发SLF4J多提供者冲突警告:
Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts
SLF4J(W): Class path contains multiple SLF4J providers.
SLF4J(W): Found provider [org.neo4j.server.logging.slf4j.SLF4JLogBridge@294e5088]
SLF4J(W): Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@51972dc7]
SLF4J(W): See https://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J(I): Actual provider is of type [org.neo4j.server.logging.slf4j.SLF4JLogBridge@294e5088]
- 尝试排除
org.slf4j:slf4j-nop无效;切换到Neo4j Test Harness v5.26.7后,出现新错误:
class org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast to class org.apache.logging.log4j.core.LoggerContext
解决方案
1. 处理Neo4j Test Harness 2025.04.0的SLF4J冲突
新版本Neo4j Test Harness自带了SLF4J桥接实现,和SpringBoot默认的Logback冲突。需直接排除Neo4j提供的SLF4J桥接,而非旧版本的slf4j-nop,同时解决spring-jcl的警告。
Maven配置:
<dependency> <groupId>org.neo4j.test</groupId> <artifactId>neo4j-harness</artifactId> <version>2025.04.0</version> <scope>test</scope> <exclusions> <!-- 排除Neo4j自带的SLF4J桥接提供者 --> <exclusion> <groupId>org.neo4j</groupId> <artifactId>neo4j-slf4j-log-bridge</artifactId> </exclusion> <!-- 排除commons-logging,消除spring-jcl警告 --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
Gradle配置:
testImplementation('org.neo4j.test:neo4j-harness:2025.04.0') { exclude group: 'org.neo4j', module: 'neo4j-slf4j-log-bridge' exclude group: 'commons-logging', module: 'commons-logging' }
2. 处理Neo4j Test Harness v5.26.7的类型转换错误
该版本Harness依赖Log4j,与SpringBoot默认的SLF4J+Logback栈冲突,导致LoggerContext类型不兼容。推荐通过排除Log4j核心依赖、添加Log4j转SLF4J的桥接来统一日志实现。
Maven配置:
<dependency> <groupId>org.neo4j.test</groupId> <artifactId>neo4j-harness</artifactId> <version>5.26.7</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </exclusion> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加Log4j到SLF4J的桥接依赖 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <scope>test</scope> </dependency>
Gradle配置:
testImplementation('org.neo4j.test:neo4j-harness:5.26.7') { exclude group: 'org.apache.logging.log4j', module: 'log4j-core' exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'commons-logging', module: 'commons-logging' } testImplementation 'org.apache.logging.log4j:log4j-to-slf4j'
3. 验证步骤
- 执行
mvn dependency:tree(Maven)或gradle dependencies(Gradle),检查依赖树,确保仅保留Logback作为SLF4J提供者,无重复日志实现。 - 启动测试,确认日志警告和类型转换错误均消失。
内容的提问来源于stack exchange,提问作者Chris

