LoggerFactory 不是 Logback LoggerContext 但 Logback 在类路径上

LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

我认为 spring-boot-starter-security 中的某些模块与 log4j 冲突,但我不知道是哪个。

我的gradle依赖如下:

compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-security"){
    exclude module: "spring-boot-starter-logging"
}

compile "org.apache.logging.log4j:log4j-api"
compile "org.apache.logging.log4j:log4j-core"
compile "org.apache.logging.log4j:log4j-slf4j-impl"
compile('org.apache.poi:poi:3.10.1')
compile('org.apache.poi:poi-ooxml:3.10.1')
testCompile("junit:junit")

我想通了

compile("org.springframework.boot:spring-boot-starter-security"){
    exclude module: "spring-boot-starter-logging"
    exclude module: "logback-classic"
}
compile("org.springframework.boot:spring-boot-starter-thymeleaf"){
    exclude module: "logback-classic"
}

maven 的相同解决方案:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>1.5.1.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
    </exclusions>
</dependency>

使用IDEA"Show Dependencies"或mvn dependency:tree -Dverbose查找所有logback-classic jar文件,并排除

对我来说,这个问题只在执行 maven-surefire-plugin 时出现。 Logback 以某种方式存在于 class 路径中,即使它没有添加到项目依赖项中。我添加了这样的修复:

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-surefire-plugin</artifactId>
     <version>${maven-surefire-plugin.version}</version>
     <configuration>
        <systemPropertyVariables>
            <org.springframework.boot.logging.LoggingSystem>
                org.springframework.boot.logging.log4j2.Log4J2LoggingSystem
            </org.springframework.boot.logging.LoggingSystem>
        </systemPropertyVariables>
    </configuration>
</plugin>

您也可以使用

mvn clean install -Dorg.springframework.boot.logging.LoggingSystem=org.springframework.boot.logging.log4j2.Log4J2LoggingSystem

我的问题继续存在:删除 Logback 或竞争实现 class org.apache.logging.slf4j.Log4jLoggerFactory 从 log4j-slf4j-impl-2.12 加载。0.jar

我加了

configurations {
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
        exclude group: 'ch.qos.logback', module: 'logback-classic'
        exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j'
    }
}

到我的 gradle.build 并且还用最新版本刷新了所有项目依赖项并且问题已解决。

根据 this bug,捆绑且不可删除的 Kotlin 插件(让我想起 U2 的专辑被强制包含在 iOS 中)包括 org.gradle.kotlin.kotlin-dsl,这反过来会污染类路径不兼容的日志库(即使禁用)。

我通过在首选项中将 运行ner 从“IntelliJ IDEA”更改为“Gradle”解决了这个问题:

  • 构建、执行、部署
    • 构建工具
      • Gradle
        • 使用 -> Gradle
        • 构建 运行
        • 运行 测试使用 -> Gradle

根据这个 documentation,Spring 由于 Web 启动器,Boot 会自动配置 Log Back 库。您应该排除 spring-boot-starter-logging 以解决此问题。

要排除 gradle 项目上的默认 LogBack 配置,

configurations {
    all*.exclude module : 'spring-boot-starter-logging'
    all*.exclude module : 'logback-classic'
}