【问题标题】:Definitive answer on slf4j and logback-classic transitive dependency关于 slf4j 和 logback-classic 传递依赖的明确答案
【发布时间】:2017-09-05 12:22:56
【问题描述】:

我一直在努力解决加载 logback-classic 作为传递依赖问题。我遵循在 stackoverflow 上找到的建议,但是它不断重复发生。

我使用 maven 排除来尝试控制它,它根本没有出现在我的 pom 依赖关系层次结构中。然而它仍然被加载!

这是我的运行时跟踪

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/david/.m2/repository/de/ruedigermoeller/kontraktor-http/3.33/kontraktor-http-3.33.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/david/.m2/repository/ch/qos/logback/logback-classic/1.2.1/logback-classic-1.2.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
W 13:22:24:837 : DispatcherThread 1 : DispatcherThread : 
java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getLoggerFactoryClassStr()Ljava/lang/String;
at org.slf4j.LoggerFactory.reportActualBinding(LoggerFactory.java:271)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:143)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:120)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:331)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
at org.quartz.impl.StdSchedulerFactory.<init>(StdSchedulerFactory.java:284)
at org.quartz.impl.StdSchedulerFactory.getDefaultScheduler(StdSchedulerFactory.java:1539)
at uk.co.example.ExampleEwsService.init(ExampleEwsService.java:296)

部分问题在于 Kontraktor 框架覆盖了 StaticLoggerBinder.getLoggerFactoryClassStr 方法。但是很容易确保它首先被加载,然后从正在加载它的石英中排除 logback-classic,如下所示:

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.3</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz-jobs</artifactId>
        <version>2.2.3</version>
    </dependency>

此时 slf4j 仅由 kontraktor 加载。 logback-classic 在依赖项中无处出现:树

[INFO] +- de.ruedigermoeller:kontraktor:jar:3.33:compile
[INFO] |  +- org.jctools:jctools-core:jar:1.0:compile
[INFO] |  \- de.ruedigermoeller:fst:jar:2.44.5:compile
[INFO] |     +- com.fasterxml.jackson.core:jackson-core:jar:2.5.3:compile
[INFO] |     +- org.javassist:javassist:jar:3.19.0-GA:compile
[INFO] |     +- org.objenesis:objenesis:jar:2.1:compile
[INFO] |     \- com.cedarsoftware:java-util:jar:1.9.0:compile
[INFO] |        \- com.cedarsoftware:json-io:jar:2.5.1:compile
[INFO] +- de.ruedigermoeller:kontraktor-http:jar:3.33:compile
[INFO] |  +- io.github.lukehutch:fast-classpath-scanner:jar:1.2.3:compile
[INFO] |  +- org.apache.httpcomponents:httpasyncclient:jar:4.1:compile
[INFO] |  |  +- org.apache.httpcomponents:httpcore:jar:4.4.1:compile
[INFO] |  |  +- org.apache.httpcomponents:httpcore-nio:jar:4.4.1:compile
[INFO] |  |  +- org.apache.httpcomponents:httpclient:jar:4.4.1:compile
[INFO] |  |  |  \- commons-codec:commons-codec:jar:1.9:compile
[INFO] |  |  \- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  +- javax.websocket:javax.websocket-api:jar:1.1:compile
[INFO] |  +- io.undertow:undertow-core:jar:1.2.8.Final:compile
[INFO] |  |  +- org.jboss.logging:jboss-logging:jar:3.1.4.GA:compile
[INFO] |  |  +- org.jboss.xnio:xnio-api:jar:3.3.1.Final:compile
[INFO] |  |  \- org.jboss.xnio:xnio-nio:jar:3.3.1.Final:runtime
[INFO] |  +- io.undertow:undertow-websockets-jsr:jar:1.2.8.Final:compile
[INFO] |  |  +- io.undertow:undertow-servlet:jar:1.2.8.Final:compile
[INFO] |  |  |  +- org.jboss.spec.javax.servlet:jboss-servlet-api_3.1_spec:jar:1.0.0.Final:compile
[INFO] |  |  |  \- org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:jar:1.0.0.Final:compile
[INFO] |  |  \- org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:jar:1.1.0.Final:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.7.12:compile
[INFO] |  \- org.jsoup:jsoup:jar:1.8.2:compile
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.5:compile
[INFO] +- org.apache.logging.log4j:log4j-core:jar:2.5:compile
[INFO] +- org.quartz-scheduler:quartz:jar:2.2.3:compile
[INFO] |  \- c3p0:c3p0:jar:0.9.1.1:compile
[INFO] +- org.quartz-scheduler:quartz-jobs:jar:2.2.3:compile

这么简单的问题,logback-classic 是如何加载的,谁在加载它?

【问题讨论】:

  • 日志显示您的类路径中仍然有 logback-classic-1.2.1.jar。也许尝试 mvn clean ,或者你 ide 中的任何 clean 命令都可以解决这个问题。
  • 尝试了 mvn clean install 和 maven clean package,结果没有改变。我知道它在我的类路径中,我需要找出是谁将它包含在其中。
  • 尝试了其他具有依赖目标的选项并专门寻找依赖?例如mvn dependency:tree -Dincludes=org.slf4j:slf4j-api
  • 这个方法让我找到了依赖。似乎依赖:树只有这么深。 -Dincludes 在整个层次结构中搜索指定的依赖项。

标签: java maven slf4j transitive-dependency logback-classic


【解决方案1】:

Darren Forsythe 的评论就是答案。这 -Dincludes=ch.qos.logback:logback-classic 允许我找到依赖项。似乎依赖:树搜索只有这么深。 -Dincludes 在整个层次结构中搜索指定的依赖项。

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 2016-09-17
    • 1970-01-01
    • 2012-10-05
    • 2019-11-29
    • 2018-12-12
    • 2013-06-22
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多