SLF4J Logback LoggerContext 冲突

SLF4J Logback LoggerContext Conflicts

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

但是,当我尝试 运行 .jar 时,从命令行我得到 LoggerFactory 不是 Logback LoggerContext 但 Logback 在 classpath异常。

它在两个地方 /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: 加载失败 class "org.slf4j.impl.StaticLoggerBinder".

,它将启动失败

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

使用该依赖项构建时,它会说无法加载 slf4j class
    <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 错误。

在此回顾一下:

我是不是漏了什么?我是否需要以某种方式打包我的应用程序以使其不包含 SLF4J 依赖项?

我不清楚你的 <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>

如果您正在使用 Spring-boot 执行器,仅排除 spring-logging 可能无济于事。 您将必须为其提供日志记录。 Spring 引导支持 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