Come escludo tutte le istanze di una dipendenza transitiva quando utilizzo Gradle?


104

Il mio progetto gradle utilizza il applicationplugin per creare un file jar. Come parte delle dipendenze transitive di runtime, finisco per tirare in org.slf4j:slf4j-log4j12. (Viene indicato come una dipendenza sub-transitiva in almeno 5 o 6 altre dipendenze transitive: questo progetto utilizza spring e hadoop, quindi tutto tranne il lavello della cucina viene tirato dentro ... no aspetta ... anche quello è lì :) ).

Voglio escludere globalmente il slf4j-log4j12vaso dal mio vaso costruito. Quindi ho provato questo:

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

Tuttavia, questo sembra escludere tutti gli org.slf4j artefatti inclusi slf4j-api. Quando si esegue in modalità debug, vedo linee come:

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

Non voglio dover cercare l'origine di ogni slf4j-log4j12dipendenza transitiva e quindi avere compile foo { exclude slf4j... }istruzioni individuali nel mio dependenciesblocco.

Aggiornare:

Ho provato anche questo:

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

Il che finisce per escludere tutto dalla build! Come se avessi specificato group: "*".

Aggiornamento 2:

Sto usando Gradle versione 1.10 per questo.


2
potresti voler accettare le risposte alle tue domande; è educato e attira più interesse nel rispondere alle tue domande
Michael Deardeuff

Risposte:


137

Ah, il seguente funziona e fa quello che voglio:

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

Sembra che una regola di esclusione abbia solo due attributi - groupe module. Tuttavia, la sintassi precedente non impedisce di specificare alcuna proprietà arbitraria come predicato. Quando si tenta di escludere da una singola dipendenza non è possibile specificare proprietà arbitrarie. Ad esempio, questo non riesce:

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

con

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

Quindi anche se puoi specificare una dipendenza con a group:e name:non puoi specificare un'esclusione con name:!?!

Forse una domanda a parte, ma allora cos'è esattamente un modulo ? Riesco a capire la nozione Maven di groupId: artifactId: version, che capisco si traduce in group: name: version in Gradle. Ma allora, come faccio a sapere a quale modulo (in gradle-speak) appartiene un particolare artefatto Maven?


1
Questa sembra una discussione migliore per i forum di Gradle .
superEb


3
Uffa, ho solo lottato con questo problema esatto. Trovo così eccezionalmente difficile fare qualsiasi cosa con Gradle, soprattutto risolvere i conflitti su un grande progetto. Prenderei volentieri xml dettagliato con convalida xsd su dsl di
gradle

Il "nome:" dovrebbe essere "modulo:", quindi funzionerà per te :)
GuyK

1
A beneficio di me e di altri futuri, volevo escludere TUTTE le librerie di dipendenze (Gradle 3.3) dal mio pacchetto war. Quindi, invece di elencarli tutti, l'ho semplicemente fatto configurations { runtime.exclude group: '*' }.
user1070304

39

Per escludere una o più librerie a livello globale, aggiungi quanto segue al tuo build.gradle

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

Ora il blocco di esclusione ha due proprietà gruppo e modulo . Per quelli di voi provenienti da un background esperto , group è uguale a groupId e module è uguale a artifactId . Esempio: per escludere com.mchange: c3p0: 0.9.2.1 di seguito dovrebbe essere escludi blocco

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

1
grazie capisco, avrebbero potuto dire che modulo significa nome
Remario

29

Il tuo approccio è corretto. (A seconda delle circostanze, potresti volerlo usare configurations.all { exclude ... }.) Se questi escludono davvero più di una singola dipendenza (non l'ho mai notato quando li uso), per favore segnala un bug su http://forums.gradle.org , idealmente con un esempio riproducibile.


1
configurations.all{}è esattamente quello che stavo cercando. Grazie per il post Peter
pczeus

20

nell'esempio sotto escludo

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' 
}

5

Stavo usando lo spring boot 1.5.10 e cerca di escludere il logback, la soluzione fornita sopra non ha funzionato bene, invece uso le configurazioni

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

3

Oltre a quanto affermato da @ berguiga-mohamed-amine, ho appena scoperto che un carattere jolly richiede di lasciare l'argomento del modulo come stringa vuota:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.