You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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!");
  }
}

问题原因

  1. 依赖冲突与版本不一致:同时引入log4j-slf4j-impl和log4j-slf4j18-impl会造成SLF4J提供者冲突,且两个依赖版本不统一,导致SLF4J无法识别有效的日志实现。
  2. JDK9+模块化影响:JDK11采用JPMS模块化系统,若项目启用模块化但未在module-info.java中声明对Log4j模块的依赖,会导致SLF4J无法加载到Log4j的实现类。
  3. 配置文件缺失:若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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:25:25