java - 解决maven项目中的多个SLF4J绑定(bind)

标签 java maven dependencies slf4j logback

这个问题听起来像是一堆 similar questions在 SE 网站上,所以我应该非常冗长以明确我的问题。所以,这是项目的最小 pom.xml:

<dependencies>
     <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.6</version>
    </dependency>

   <dependency>
        <groupId>org.codehaus.gmaven.runtime</groupId>
        <artifactId>gmaven-runtime-1.7</artifactId>
        <version>1.3</version>
   </dependency>

</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <configuration>
                <mainClass>org.shabunc.App</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

这是maven生成的依赖树。

mvn dependency:tree -Dverbose -Dincludes=org.slf4j:

[INFO] [dependency:tree {execution: default-cli}]
[INFO] org.shabunc:logdebug:jar:1.0-SNAPSHOT
[INFO] \- ch.qos.logback:logback-classic:jar:1.0.6:compile
[INFO]    \- org.slf4j:slf4j-api:jar:1.6.5:compile

现在,让我们移除排除项并再次检查依赖项。我们会得到:

 [INFO] org.shabunc:logdebug:jar:1.0-SNAPSHOT
[INFO] +- ch.qos.logback:logback-classic:jar:1.0.6:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.6.5:compile
[INFO] \- org.codehaus.gmaven.runtime:gmaven-runtime-1.7:jar:1.3:compile
[INFO]    +- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5)
[INFO]    +- org.codehaus.gmaven.feature:gmaven-feature-support:jar:1.3:compile
[INFO]    |  \- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5)
[INFO]    \- org.codehaus.gmaven.runtime:gmaven-runtime-support:jar:1.3:compile
[INFO]       +- (org.slf4j:slf4j-api:jar:1.5.10:compile - omitted for conflict with 1.6.5)
[INFO]       \- org.sonatype.gshell:gshell-io:jar:2.0:compile
[INFO]          \- org.sonatype.gossip:gossip:jar:1.0:compile
[INFO]             \- (org.slf4j:slf4j-api:jar:1.5.8:compile - omitted for conflict with 1.6.5)

因此,正如我们所见,一切都按预期工作,实际上排除了冲突的依赖关系。但问题是,即使排除了 依赖项,我在编译和调用 mvn exec:java 时仍然会收到以下消息:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/shabunc/.m2/repository/ch/qos/logback/logback-classic/1.0.6/logback-classic-1.0.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/shabunc/.m2/repository/org/sonatype/gossip/gossip/1.0/gossip-1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]

问题是:为什么我仍然看到这个警告,以及究竟应该做什么才能在执行期间只访问一个版本的 slf4j?

最佳答案

您的问题不是获取 SLF4J API 的两个副本,而是获取两个不同的 SLF4J 实现。您需要排除八卦,而不是 API。这意味着:

<dependency>
    <groupId>org.codehaus.gmaven.runtime</groupId>
    <artifactId>gmaven-runtime-1.7</artifactId>
    <version>1.3</version>
    <exclusions>
      <exclusion>
        <groupId>org.sonatype.gossip</groupId>
        <artifactId>gossip</artifactId>
      </exclusion>
    </exclusions>
</dependency>

Gossip依赖由gshell-io声明;希望它实际上不需要 Gossip,它只需要一个 SLF4J SLF4J,您以 Logback 的形式提供它。

关于java - 解决maven项目中的多个SLF4J绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11758676/

相关文章:

java - 查找特定日期某个时间的天数、小时数和分钟数

java - iReport/JasperReports 3.6.1 中重复值的问题

Java 多态性将子类型相互数组

java - 静态检查 Java 应用程序是否存在链接错误

java - java/maven如何在运行时解决依赖冲突

python - 即使手动安装所有依赖项后,也无法使用 pip 安装 Seaborn

java - 如何在 Maven 中为我的依赖项之一指定特定依赖项版本

maven - 在 POM.xml 中插入 MAVEN_OPTS

java - 如何远程调试maven测试

linux - 如何摆脱 'GLIBCXX_3.4.9 not found error' ?