19

これは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の1つのバージョンのみに到達できるようにするために正確に何をすべきかということです。

4

3 に答える 3

23

問題は、SLF4J APIの2つのコピーを取得することではなく、2つの異なるSLF4J実装を取得することです。APIではなくGossipを除外する必要があります。つまり、次のような意味です。

<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は必要ありません。必要なのは、Logbackの形で提供しているSLF4JSLF4Jだけです。

于 2012-08-01T12:33:05.407 に答える
4

あなたがする必要があるのはこのようなものを追加することです

compile "org.sonatype.gossip:gossip:1.0" {
    exclude module:'slf4j-jcl'
    exclude module:'slf4j-log4j12'
}
于 2012-08-01T12:21:33.007 に答える
2

依存関係の範囲を試す必要があると思います。http ://www.mojohaus.org/exec-maven-plugin/java-mojo.htmlを参照してください。

classpathScope-プラグインに渡されるクラスパスのスコープを定義します。必要に応じて、コンパイル、テスト、ランタイム、またはシステムに設定します。

于 2012-08-01T12:09:27.193 に答える