Разрешить множественные привязки SLF4J в проекте maven
Это вопрос, похожий на кучу похожих вопросов на сайтах 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
Ваша проблема заключается не в получении двух копий API SLF4J, а в получении двух разных реализаций SLF4J. Вам нужно исключить Gossip, а не 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, который вы поставляете в виде журнала.
Ответ 2
Все, что вам нужно сделать, это добавить что-то вроде этого
compile "org.sonatype.gossip:gossip:1.0" {
exclude module:'slf4j-jcl'
exclude module:'slf4j-log4j12'
}
Ответ 3
Я думаю, вам нужно играть с объемом зависимостей, см.: http://www.mojohaus.org/exec-maven-plugin/java-mojo.html
classpathScope
- определяет область действия класса, переданного плагину. Установите для компиляции, тестирования, выполнения или системы в зависимости от ваших потребностей.