Gradle'ı kullanırken geçişli bağımlılığın tüm örneklerini nasıl dışlarım?


108

Gradle projem, applicationbir jar dosyası oluşturmak için eklentiyi kullanıyor . Çalışma zamanı geçişli bağımlılıklarının bir parçası olarak, içeri girmeye başladım org.slf4j:slf4j-log4j12. (En az 5 veya 6 diğer geçişli bağımlılıkta alt geçişli bağımlılık olarak anılır - bu proje yay ve hadoop kullanıyor, bu nedenle mutfak lavabosu dışındaki her şey içeri çekiliyor ... bekle ... bu da var :) ).

slf4j-log4j12Kavanozu yapılı kavanozumdan küresel olarak çıkarmak istiyorum . Ben de bunu denedim:

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

Ancak, bu, dahil tüm org.slf4j eserleri hariç tutuyor gibi görünüyor slf4j-api. Hata ayıklama modunda çalışırken aşağıdaki gibi satırlar görüyorum:

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).

Her slf4j-log4j12geçişli bağımlılığın kaynağına bakmak ve ardından bloğumda ayrı compile foo { exclude slf4j... }ifadeler kullanmak istemiyorum dependencies.

Güncelleme:

Bunu da denedim:

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

Bu, yapıdaki her şeyi hariç tutar ! Sanki ben belirtmişim gibi group: "*".

Güncelleme 2:

Bunun için Gradle 1.10 sürümünü kullanıyorum.


2
sorularınızın yanıtlarını kabul etmek isteyebilirsiniz; kibar ve sorularınızı yanıtlamakla daha fazla ilgileniyor
Michael Deardeuff

Yanıtlar:


144

Ah, şu işe yarıyor ve istediğimi yapıyor:

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

Görünüşe göre bir Hariç Tutma Kuralının yalnızca iki özelliği vardır - groupve module. Ancak, yukarıdaki sözdizimi herhangi bir keyfi özelliği yüklem olarak belirlemenizi engellemez. Bireysel bir bağımlılıktan dışlamaya çalışırken, rastgele özellikler belirleyemezsiniz. Örneğin, bu başarısız olur:

dependencies {
  compile ('org.springframework.data:spring-data-hadoop-core:2.0.0.M4-hadoop22') {
    exclude group: "org.slf4j", name: "slf4j-log4j12"
  }
}

ile

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

Eğer bir bir bağımlılık belirtebilirsiniz Yani rağmen group:ve name:bir ile bir dışlama belirleyemezsiniz name:!?!

Belki ayrı bir soru ama ne tam olarak bir olduğunu modül o zaman? Gradle'da group: name: version'a çevrildiğini anladığım groupId: artifactId: version Maven kavramını anlayabiliyorum. Ama sonra, belirli bir Maven eserinin hangi modüle ait olduğunu (kademeli olarak) nasıl bilebilirim?


1
Bu Gradle forumları için daha iyi bir tartışma gibi görünüyor .
superEb


5
Ugh, tam olarak bu sorunla uğraştım. Gradle ile herhangi bir şey yapmayı, özellikle büyük bir projedeki çatışmaları çözmeyi son derece zor buluyorum. Mutlulukla alırdım ayrıntılı xml ile Xsd doğrulama gradle en DSL üzerinde
cjbooms

"Name:" "modül:" olmalıdır, o zaman u için çalışacaktır :)
GuyK

1
Gelecekteki ben ve başkalarının yararı için, TÜM bağımlılık kitaplıklarını (Gradle 3.3) savaş paketimden çıkarmak istedim. Bu yüzden her birini listelemek yerine, basitçe yaptım configurations { runtime.exclude group: '*' }.
user1070304

41

Bir veya daha fazla kitaplığı genel olarak hariç tutmak için, aşağıdakileri build.gradle dosyanıza ekleyin

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

Artık dışlama bloğunun iki özellik grubu ve modülü vardır . Maven arka plandan gelen o sizin için, grup ile aynıdır GroupID ve modül aynıdır artifactId . Örnek: com.mchange'i hariç tutmak için: c3p0: 0.9.2.1 aşağıdaki bloğu hariç tutmalıdır

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

1
teşekkürler,
anladım

31

Yaklaşımınız doğru. (Koşullara bağlı olarak, kullanmak isteyebilirsiniz configurations.all { exclude ... }.) Bu dışlamalar gerçekten tek bir bağımlılıktan fazlasını dışlarsa (bunları kullanırken bunu hiç fark etmedim), lütfen http://forums.gradle.org adresinde bir hata bildirin ideal olarak tekrarlanabilir bir örnekle.


2
configurations.all{}tam olarak aradığım şeydi.
Gönderi

21

aşağıdaki örnekte hariç tutuyorum

Spring-boot-starter-tomcat

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

6

Spring boot 1.5.10 kullanıyordum ve logback'i hariç tutmaya çalışıyordum, yukarıda verilen çözüm iyi çalışmadı, bunun yerine konfigürasyonları kullanıyorum

configurations.all {
    exclude group: "org.springframework.boot", module:"spring-boot-starter-logging"
}

3

@ Berguiga-mohamed-amine'in belirttiğine ek olarak, bir joker karakterin modül bağımsız değişkenini boş dizge bırakmayı gerektirdiğini buldum:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.