Как исключить множественные привязки SLF4J к LOG4J

Я получаю сообщение об ошибке

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/george/.gradle/caches/artifacts-26/filestore/org.apache.logging.log4j/log4j-slf4j-impl/2.0-beta8/jar/15984318e95b9b0394e979e413a4a14f322401c1/log4j-slf4j-impl-2.0-beta8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/george/.gradle/caches/artifacts-26/filestore/org.slf4j/slf4j-log4j12/1.5.0/jar/aad1074d37a63f19fafedd272dc7830f0f41a977/slf4j-log4j12-1.5.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

В моем файле build.gradle у меня есть следующая строка, чтобы включить jar log4j-slf4j-impl-2.0-beta8.jar(который я хочу привязать к LOG4J2)

 compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.0-beta8' 

В другом файле build.gradle в зависимом проекте у меня есть несколько строк, похожих на следующие:

 compile 'dcm4che:dcm4che-core:2.0.23'

Теперь dcm4che включает зависимость от log4j версии 1 (slf4j-log4j12), и поэтому он включается в общий проект.

Вот фрагмент из дерева зависимостей Gradle:

|    +--- dcm4che:dcm4che-core:2.0.23
|    |    \--- org.slf4j:slf4j-log4j12:1.5.0
|    |         +--- org.slf4j:slf4j-api:1.5.0 -> 1.7.5
|    |         \--- log4j:log4j:1.2.13 -> 1.2.14

Я прочитал ссылку предложенную в предупреждении, но я не могу понять, как сделать привязку моего приложения к log4j2, используя банку, которую я хочу. Документация Gradle по управлению зависимостями на самом деле не стала более ясной.

Ответ 1

Решение состоит в том, чтобы добавить следующее в build.gradle.

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.name == 'log4j') {
            details.useTarget "org.slf4j:log4j-over-slf4j:1.7.5"
        }
}

В результате все, что обычно требует log4j, вместо этого будет использовать log4j-over-slf4j.

Я также добавил:

if (details.requested.name == 'commons-logging') {
    details.useTarget "org.slf4j:jcl-over-slf4j:1.7.5"
}

для полноты, чтобы охватить запись в сообщества.

Ответ 2

Поместите этот код в свой build.gradle файл

configurations.all {
   exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}

Ответ 3

Исключить зависимость, содержащую slf4j.jar, которую вы используете не. Для gradle это может помочь в этом.

обновление:

К сожалению, я не знаком с gradle, но судя по связанной документации sth. как

compile('dcm4che:dcm4che-core:2.0.23') {
   exclude group: 'org.slf4j'
}

может работать? Обратите внимание, что в документации упоминается список исключений "конфигурация-глобальный", который может быть лучшим способом сделать это, но я не смог найти больше информации об этом.