从JDK8迁移到JDK11后出现SLF4J无提供者错误,日志失效
JDK8迁移JDK11后SLF4J日志无法输出问题解决
问题现象
将项目从JDK8迁移到JDK11后,启动时出现以下错误,日志完全无法输出:
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
原JDK8环境下的Maven依赖(运行正常):
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.7</version> </dependency>
迁移后尝试添加log4j-slf4j18-impl依赖但问题依旧,当前依赖配置存在版本不一致和冗余问题:
<maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target>
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j18-impl</artifactId> <version>2.18.0</version> </dependency>
测试代码(JDK8正常,JDK11无输出):
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestOutput { private static final Logger LOG = LoggerFactory.getLogger(TestOutput.class); public static void tryToLog() { LOG.info("Hello world!"); } }
问题原因
- 依赖冲突与版本不一致:同时引入
log4j-slf4j-impl和log4j-slf4j18-impl会造成SLF4J提供者冲突,且两个依赖版本不统一,导致SLF4J无法识别有效的日志实现。 - JDK9+模块化影响:JDK11采用JPMS模块化系统,若项目启用模块化但未在
module-info.java中声明对Log4j模块的依赖,会导致SLF4J无法加载到Log4j的实现类。 - 配置文件缺失:若
log4j2.xml等配置文件未放置在正确路径(如src/main/resources),Log4j无法初始化,也会触发NOP日志实现。
解决方案
1. 清理冗余依赖,统一版本
移除log4j-slf4j18-impl依赖,保持所有Log4j相关依赖版本一致。log4j-slf4j-impl从2.10.0版本开始已经适配SLF4J 1.8+,无需额外引入log4j-slf4j18-impl。
修正后的Maven依赖:
<maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.19.0</version> </dependency> </dependencies>
2. 处理模块化项目(若启用JPMS)
如果项目使用了module-info.java,需要添加以下模块声明:
module your.module.name { requires org.apache.logging.log4j; requires org.apache.logging.log4j.slf4j; requires org.apache.logging.log4j.core; // 允许Log4j反射访问你的模块(如果需要日志记录模块内的类) opens your.package.name to org.apache.logging.log4j.core; }
3. 确保Log4j配置文件存在
在src/main/resources下添加log4j2.xml配置文件,示例配置:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
4. 验证与清理
- 执行
mvn clean install清理并重新构建项目 - 在IntelliJ中刷新Maven依赖(点击Maven面板的刷新按钮)
- 重启IDE,重新运行测试代码
内容的提问来源于stack exchange,提问作者user1857773
相关产品推荐
相关产品推荐

