【问题标题】:Log4j2/slf4j - Should commons-logging.jar be removed from classpath?Log4j2/slf4j - 是否应该从类路径中删除 commons-logging.jar?
【发布时间】:2017-10-31 20:22:43
【问题描述】:

我的日志依赖项目前如下所示:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-bom</artifactId>
            <version>2.9.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
    </dependency>

我注意到 commons-logging.jar 出于某种原因仍在我的类路径中。我应该排除它还是不会导致任何问题?

到目前为止我没有发现任何问题,但我仍然想知道那个 jar 是否还会以某种方式引起问题。

【问题讨论】:

  • 是否还有其他依赖于commons-logging
  • 可能有,因此它最终进入了 WAR。我应该检查依赖关系树。我的问题是:我应该排除它吗?
  • 如果排除它,期望它存在并尝试使用它的依赖项会发生什么?
  • 不知道 :(。我真的被 Java 的这些日志记录框架困住了。真是个 PITA,啊。
  • 好吧,当您尝试使用不存在的依赖项时会发生什么?事情是完美的,还是出了问题?

标签: java maven log4j slf4j


【解决方案1】:

存在使用commons-logging 的依赖项。如果它不存在,您将在他们尝试登录时收到NoClassDefFoundErrors。如果有可能让那些甚至没有 try 的人使用依赖项,那将不是问题。不过这种可能性不大。

但是,如果他们使用 commons-logging 而您使用的是 SLF4J,那么就会出现问题。他们在错误的地方登录(从您的角度来看)。这就是伐木桥发挥作用的地方。它们实现了不同日志框架的公共 API,但会将日志重定向到您正在使用的内容。

对于SLF4J,有several bridges(两种方式),所以不要引入commons-logging,而是引入jcl-over-slf4j。库会认为他们在使用 commons-logging,而实际上他们在使用 SLF4J(然后使用像 Logback 这样的实际日志记录实现)。

简单吧? ;)

【讨论】:

  • 哇,这终于说得通了。非常感谢您的解释!我会将桥添加为依赖项。所以下一步是摆脱commons-logging.jar。我是否应该为每个以某种方式依赖commons-logging 的项目添加一个 Maven 排除项,这可能会令人沮丧地维持未来,还是有更聪明的方法来摆脱这种依赖关系?如果这是有道理的...... :)
  • 顺便说一句,仅供参考,我决定离开 LOG4J 并决定用 Logback 替换它。我喜欢您可以通过 Logback 中的 JMX 更改配置的事实。
  • 我不知道有什么包罗万象的解决方案。这主要是旧库的问题,当时commons-logging 是一个无处不在的依赖项。它确实让你的 pom 变得非常丑陋,但它们通常一开始并不那么漂亮。 Logback 的好选择,它绝对是一个比 Log4J 更好的框架(虽然我听说 Log4J2 是“最好的”这些天,但并不太在意)。我也修复了你的标签,有 log4j2 而不是 log4j
  • Kayaman:为了您的兴趣,我找到了一种巧妙的方法来删除对commons-logging 的所有依赖项。正如slf4j.org/faq.html 所解释的,它是通过依赖一个空的version 99 来完成的。它适用于我的构建。
  • 啊,太好了。
【解决方案2】:

是的,排除 commons-logging 依赖并添加 log4j-jcl 桥:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
</dependency>

SLF4J API 也是多余的,因为它已经是 log4j-slf4j-impl 绑定的传递依赖。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2012-12-11
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多