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 错误。
在此回顾一下:
- 构建和 运行 自己运行 jar,但会失败,因为它需要存在于
mapr classpath
中的依赖项。
- 运行 带有
mapr classpath
的 jar 失败,因为 /opt/mapr/lib. 中的 slf4j jar
- 删除那个 jar 会导致另一个关于 /opt/mapr/hadoop/hadoop-2.7.0/share/hadoop/common/lib/.
中的 slf4j jar 的失败
- 删除该 jar 然后应用程序失败,因为它现在找不到任何 slf4j 绑定。
我是不是漏了什么?我是否需要以某种方式打包我的应用程序以使其不包含 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
我正在为我的应用程序部署 spring 启动可执行 jar。我正在使用 SLF4J 日志记录,当我在 IntelliJ 中构建和 运行 时,我没有遇到任何问题。
但是,当我尝试 运行 .jar 时,从命令行我得到 LoggerFactory 不是 Logback LoggerContext 但 Logback 在 classpath异常。
它在两个地方 /opt/mapr/lib/
和 /opt/mapr/hadoop/hadoop-2.7.0/share/hadoop/common/lib/
.
如果我从两个地方和 运行 我的应用程序中删除罐子:
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 错误。
在此回顾一下:
- 构建和 运行 自己运行 jar,但会失败,因为它需要存在于
mapr classpath
中的依赖项。 - 运行 带有
mapr classpath
的 jar 失败,因为 /opt/mapr/lib. 中的 slf4j jar
- 删除那个 jar 会导致另一个关于 /opt/mapr/hadoop/hadoop-2.7.0/share/hadoop/common/lib/. 中的 slf4j jar 的失败
- 删除该 jar 然后应用程序失败,因为它现在找不到任何 slf4j 绑定。
我是不是漏了什么?我是否需要以某种方式打包我的应用程序以使其不包含 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