Log4j2 / slf4j - 应该从类路径中删除commons-logging.jar吗?

时间:2017-10-31 20:22:43

标签: java maven log4j slf4j

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

<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仍然在我的类路径中,出于某种原因。我应该排除或不会导致任何问题吗?

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

2 个答案:

答案 0 :(得分:2)

有些依赖项使用commons-logging。如果它不存在,那么当他们尝试登录时,您将获得NoClassDefFoundErrors。如果有可能让那些甚至没有尝试来使用依赖项,那么它就不会成为问题。然而,这不太可能。

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

对于SLF4J,有several bridges(两种方式),因此您不需要引入commons-logging,而是引入jcl-over-slf4j。当他们实际使用commons-logging(然后使用实际的日志记录实现,如Logback)时,图书馆会认为他们正在使用SLF4J

很简单,对吧? ;)

答案 1 :(得分:1)

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

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

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