SLF4J Logback LoggerContext冲突

时间:2018-12-20 19:10:55

标签: java maven spring-boot slf4j

我正在为我的应用程序部署spring boot可执行jar。我正在使用SLF4J日志记录,当我在IntelliJ中构建和运行时,我没有任何问题。

但是,当我尝试运行.jar时,从命令行我得到的 LoggerFactory不是Logback LoggerContext,但Logback在类路径上

它抱怨在两个地方/opt/mapr/lib//opt/mapr/hadoop/hadoop-2.7.0/share/hadoop/common/lib/上的 slf4j-log4j12-1.7.12.jar

如果我从两个地方都取出罐子并运行我的应用程序:

java -cp $(mapr classpath):MapRProducerApp-0.0.1-SNAPSHOT.jar org.springframework.boot.loader.PropertiesLauncher

由于 SLF4J,它将无法启动:无法加载类“ org.slf4j.impl.StaticLoggerBinder”。

我不明白为什么我的应用程序.jar通过

依赖项构建时无法加载slf4j类,为什么会失败
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

在IntelliJ中,我引入了/opt/mapr/lib文件夹中存在的所有外部依赖关系,其中包括 slf4j-log4j12-1.7.10.jar ,但是IntelliJ没有提供Logback LoggerContext错误。

在这里重述:

  • 自行构建和运行jar,但将失败,因为它需要mapr classpath内部存在的依赖项。
  • 由于/ opt / mapr / lib中的slf4j jar,使用mapr classpath运行jar失败。
  • 删除该jar会导致另一个关于/opt/mapr/hadoop/hadoop-2.7.0/share/hadoop/common/lib/的slf4j jar的失败。
  • 然后删除该jar会使该应用程序失败,因为它现在找不到任何slf4j绑定。

有什么我想念的吗?我是否需要以某种方式打包我的应用程序,使其不包括SLF4J依赖项?

2 个答案:

答案 0 :(得分:0)

我不清楚您的<dependencies>层次结构,但是通过添加<exclusion>您可以简单地解决冲突。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

答案 1 :(得分:0)

如果您使用的是 Spring-boot 执行器,仅排除 spring-logging 可能无济于事。 您必须为其提供日志记录。 Spring Boot 支持 log4j 进行日志配置。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.logging