2014-02-13 3 views
53

Мой проект градации использует плагин application для создания файла jar. В рамках переходных зависимостей времени выполнения я заканчиваю вывод org.slf4j:slf4j-log4j12. (Это называется субтранзитивной зависимостью, по крайней мере, в 5 или 6 других транзитивных зависимостях - этот проект использует весну и хаоп, поэтому все, кроме кухонной раковины, втягивается ... нет, подождите ... это тоже есть :)).Как исключить все случаи транзитивной зависимости при использовании Gradle?

Я хочу, чтобы во всем мире исключить банку slf4j-log4j12 из моей встроенной банки. Так что я попытался это:

configurations { 
    runtime.exclude group: "org.slf4j", name: "slf4j-log4j12" 
} 

Однако, это, кажется, исключает все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: "*".

Update 2:

Я использую Gradle версии 1.10 для этого.

+1

Возможно, вы захотите принять ответы на свои вопросы; он вежлив и заинтересован в ответе на ваши вопросы. –

ответ

75

Ах, следующие работы и делает то, что я хочу:

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", name: "slf4j-log4j12" 
    } 
} 

с

No such property: name for class: org.gradle.api.internal.artifacts.DefaultExcludeRule 

Таким образом, даже если вы можете определить зависимость с group: и name: вы не можете указать исключение с name:!?!

Возможно, отдельный вопрос, но что точно - это модуль? Я могу понять понятие Maven GroupId: artifactId: version, которое, как я понимаю, переводится в группу: name: version в Gradle.Но тогда, как я узнаю, какой модуль (в град-говоря) принадлежит к определенному артефакту Maven?

+1

Это похоже на лучшее обсуждение для форумов [Gradle forums] (http://forums.gradle.org/gradle). – superEb

+0

Так сделано - http://forums.gradle.org/gradle/topics/what_exactly_is_a_module_as_defined_by_gradle_dependencies –

+2

Ух, я просто боролся с этой точной проблемой. Я считаю чрезвычайно трудным сделать что-либо с помощью градиента, особенно разрешать конфликты в большом проекте. Я бы с радостью принял многословный xml с проверкой xsd над dsl gradle – cjbooms

20

Ваш подход правильный. (В зависимости от обстоятельств вы можете использовать configurations.all { exclude ... }.) Если они исключают, действительно исключают более одной зависимости (я никогда не замечал, что при их использовании), пожалуйста, напишите ошибку в http://forums.gradle.org, в идеале с воспроизводимым примером.

+1

'configurations.all {}' именно то, что я искал. Спасибо за сообщение Peter – pczeus

13

в примере ниже я исключить

весна-загрузки-стартер-кот

compile("org.springframework.boot:spring-boot-starter-web") { 
    //by both name and group 
    exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' 
} 
10

Для исключения одного или нескольких библиотеки по всему миру добавить следующие строки в build.gradle

configurations.all { 
    exclude group:"org.apache.geronimo.specs", module: "geronimo-servlet_2.5_spec" 
    exclude group:"ch.qos.logback", module:"logback-core" 
} 

Теперь блок исключений имеет два свойства gro up и модуль. Для тех из вас, исходя из Maven фона, группа такой же, как GroupID и модуль такой же, как артефакта. Примера: Для того, чтобы исключить com.mchange: C3P0: 0.9.2.1 следующим следует исключить Блокировать

exclude group:"com.mchange", module:"c3p0" 
+0

спасибо, я понимаю, они могли бы сказать, что модуль означает имя – Remario

0

Я использовал пружинные загрузки 1.5.10 и пытаюсь исключить Logback, данное решение выше не работаю хорошо, я вместо использования

configurations.all { 
    exclude group: "org.springframework.boot", module:"spring-boot-starter-logging" 
} 
Смежные вопросы