Подтвердить что ты не робот

Как исключить все экземпляры транзитивной зависимости при использовании 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 для этого.

4b9b3361

Ответ 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"