Как исключить все экземпляры транзитивной зависимости при использовании Gradle?
В моем проекте gradle используется плагин application
для создания файла jar. В рамках переходных зависимостей времени выполнения я втягиваю org.slf4j:slf4j-log4j12
. (Он упоминается как субтранзитивная зависимость по меньшей мере в 5 или 6 других транзитивных зависимостях - этот проект использует spring и hadoop, поэтому все, кроме кухонной раковины, втягивается... нет, подождите... что тоже:)).
Я хочу глобально исключить банку slf4j-log4j12
из моей встроенной банки. Поэтому я пробовал это:
configurations {
runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
}
Однако это, кажется, исключает артефакты all org.slf4j
, включая slf4j-api
. При работе в режиме отладки я вижу строки, такие как:
org.slf4j#slf4j-api is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-simple is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-log4j12 is excluded from org.apache.hadoop:hadoop-common:2.2.0(runtime).
Мне не нужно искать источник каждой транзитивной зависимости slf4j-log4j12
, а затем иметь отдельные инструкции compile foo { exclude slf4j... }
в моем блоке dependencies
.
Update:
Я также попробовал это:
configurations {
runtime.exclude name: "slf4j-log4j12"
}
Конец заканчивается, исключая все из сборки! Как будто я указал group: "*"
.
Обновление 2:
Я использую gradle версию 1.10 для этого.
Ответы
Ответ 1
А, следующее работает и делает то, что я хочу:
configurations {
runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
}
Кажется, что Exclude Rule имеет только два атрибута - group
и module
. Однако указанный выше синтаксис не мешает вам указывать произвольное свойство как предикат. При попытке исключить из индивидуальной зависимости вы не можете указать произвольные свойства. Например, это не удается:
dependencies {
compile ('org.springframework.data:spring-data-hadoop-core:2.0.0.M4-hadoop22') {
exclude group: "org.slf4j", module: "slf4j-log4j12"
}
}
с
No such property: name for class: org.gradle.api.internal.artifacts.DefaultExcludeRule
Итак, хотя вы можете указать зависимость с group:
и name:
, вы не можете указать исключение с помощью name:
!?!
Возможно, отдельный вопрос, но что такое точно - это модуль? Я могу понять понятие Maven groupId: artifactId: version, которое, как я понимаю, переводится в группу: name: version in Gradle. Но тогда, как я узнаю, какой модуль (в gradle -speak) принадлежит определенному артефакту Maven?
Ответ 2
Ваш подход правильный. (В зависимости от обстоятельств вы можете использовать configurations.all { exclude ... }
.) Если они исключают, действительно исключают больше, чем одну зависимость (я никогда не замечал этого при их использовании), пожалуйста, напишите ошибку в http://forums.gradle.org, в идеале с воспроизводимым примером.
Ответ 3
в приведенном ниже примере я исключаю
spring -boot-стартер-кот
compile("org.springframework.boot:spring-boot-starter-web") {
//by both name and group
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
Ответ 4
Для исключения одной или нескольких библиотек по всему миру добавьте следующее в свой файл build.gradle
configurations.all {
exclude group:"org.apache.geronimo.specs", module: "geronimo-servlet_2.5_spec"
exclude group:"ch.qos.logback", module:"logback-core"
}
Теперь блок exclude имеет два свойства group и module. Для тех из вас, кто приходит с фона maven, группа совпадает с groupId и module аналогична artifactId.
Пример: для исключения com.mchange: c3p0: 0.9.2.1 следует исключить блок
exclude group:"com.mchange", module:"c3p0"