2014-09-11 12 views
6

Ecco un frammento del mio build.gradle:L'esclusione della dipendenza transitoria Gradle non funziona come previsto. (Come faccio a sbarazzarsi di com.google.guava: guava-jdk5: 13,0)

compile 'com.google.api-client:google-api-client:1.19.0' 
compile 'com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0' 
compile 'com.google.apis:google-api-services-plus:v1-rev155-1.19.0' 
compile 'com.google.appengine.tools:appengine-gcs-client:0.4.1' 
compile 'com.google.appengine.tools:appengine-mapreduce:0.8' 

che importa più versioni di guava come si può vedere con dependencyInsight:

com.google.guava:guava:15.0 (conflict resolution) 

com.google.guava:guava:14.0.1 -> 15.0 
+--- com.googlecode.objectify:objectify:4.1.3 
| \--- default 
\--- net.eusashead.spring:spring-cache-gae:1.0.0.RELEASE 
    \--- default 

com.google.guava:guava:[15.0,15.99] -> 15.0 
+--- com.google.appengine.tools:appengine-gcs-client:0.4.1 
| +--- default 
| +--- com.google.appengine.tools:appengine-mapreduce:0.8 
| | \--- default 
| \--- com.google.appengine.tools:appengine-pipeline:0.2.10 
|   \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) 
+--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) 
\--- com.google.appengine.tools:appengine-pipeline:0.2.10 (*) 

com.google.guava:guava-jdk5:13.0 
\--- com.google.api-client:google-api-client:1.19.0 
    +--- default 
    +--- com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0 
    | \--- default 
    +--- com.google.apis:google-api-services-plus:v1-rev155-1.19.0 
    | \--- default 
    +--- com.google.appengine.tools:appengine-gcs-client:0.4.1 
    | +--- default 
    | +--- com.google.appengine.tools:appengine-mapreduce:0.8 
    | | \--- default 
    | \--- com.google.appengine.tools:appengine-pipeline:0.2.10 
    |   \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) 
    +--- com.google.api-client:google-api-client-appengine:1.17.0-rc 
    | \--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*) 
    +--- com.google.apis:google-api-services-storage:v1-rev1-1.18.0-rc 
    | \--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*) 
    +--- com.google.apis:google-api-services-bigquery:v2-rev154-1.19.0 
    | \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) 
    \--- com.google.api-client:google-api-client-servlet:1.17.0-rc 
      \--- com.google.api-client:google-api-client-appengine:1.17.0-rc (*) 

(*) - dependencies omitted (listed previously) 

ho provato a rimuovere la dipendenza a: facendo:

compile ('com.google.api-client:google-api-client:1.19.0'){ 
     exclude group: 'com.google.guava', module: 'guava-jdk5' 
    } 
compile ('com.google.api-client:google-api-client:1.19.0'){ 
     exclude group: 'com.google.guava', 
    } 

ma il dependencyInsight rimane lo stesso. Ho anche provato

compile ('com.google.guava:guava:15.0'){force = true} 

ma ancora una volta la dipendenza visione rimane la stessa. Come faccio a eliminare com.google.guava: guava-jdk5: 13.0?

Dettagli: Ho provato Gradle 1.2 e 2.1 su un Windows 8.1 scatola

Il motivo per me di provare questo è quello di sbarazzarsi di questa eccezione:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch; 
+0

Questa libreria appare se si pulisce e si costruisce sulla riga di comando (cioè senza un IDE coinvolto)? – Nick

+0

Lo sto eseguendo tramite la riga di comando. L'errore si verifica solo in fase di esecuzione – unify

risposta

3

Si scopre che guava-jdk5 è ancora in manutenzione.

Così ho cambiato questo:

compile ('com.google.guava:guava:15.0'){force = true} 

per questo:

compile('com.google.guava:guava-jdk5:17.0') { force = true } 

e quello fissato i miei problemi, ora posso utilizzare le classi dal pacchetto 'com.google.common' a Google App Progetto del motore con tutte le dipendenze descritte

+1

No, mi sembra che la variante JDK5 non venga mantenuta. Guava è fino a 18.0, ma la variante jdk5 non ha un 18. Vedi http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.google.guava%22%20AND%20a% 3A% 22guava-jdk5% 22 – Tom

16

Sembra che una dipendenza non verrà esclusa se c'è un'altra dipendenza da qualche parte che punta alla stessa dipendenza senza alcuna delle esclu des.

È possibile escludere una dipendenza attraverso configuration però:

configurations { 
    all*.exclude group: 'com.google.guava', module:'guava-jdk5' 
} 
+3

Questo ha funzionato per me. Grazie! Ma personalmente, non mi piace il modo in cui gradle gestisce le dipendenze. Maven è molto più chiaro e semplice. –

3

Sulla @thoutbeckers rispondono a causa di un caso speciale, in cui non pensavo che la sua risposta applicata, ma in realtà ha fatto. Spero che questa risposta possa aiutare gli altri che hanno condiviso il mio caso specifico. Originariamente pensavo che la dipendenza da transitivo negativa fosse riferita solo da una dipendenza nel file build.gradle ma che in realtà era referenziata da due dipendenze. Ciò era dovuto al fatto che entrambe le dipendenze in cui si faceva riferimento alla dipendenza transitoria errata avevano una relazione genitore/figlio, ma ho notato solo la relazione con la dipendenza figlio e non la dipendenza genitore.

Si consideri il seguente albero delle dipendenze (prodotto dal comando gradle <my-project-name>:dependencies):

compileClasspath - Compile classpath for source set 'main'. 
+--- my.org:com.my.pkg.parent:6.+ -> 6.0.4 
| +--- # misc. dependencies 
| +--- my.org:com.my.pkg.child:6.0.4 
| | +--- # misc. dependencies 
| | +--- other.org:bad.transitive.dependency:0.9.1 FAILED 
| | +--- # misc. dependencies 
| |--- # misc. dependencies 
+--- # misc. dependencies 

Dalla albero delle dipendenze, sembra che il other.org:bad.transitive:dependency:0.9.1 si fa riferimento solo da una dipendenza nel file costruire, non due.Tuttavia, si supponga che il file di Gradle assomiglia a questo:

// ... misc. ... 
dependencies { 
    // ... misc. dependencies ... 
    compile 'my.org:com.my.pkg.parent:6.+' 
    // ... misc. dependencies ... 
    compile ('my.org:com.my.pkg.child:6.0.4') { 
     exclude group: 'other.org', module: 'bad.transitive.dependency' 
} 

Per un file Gradle come quella qui sopra, l'errore persisterà anche se la dipendenza transitiva si voleva escludere si verifica solo nella dipendenza infantile, non la dipendenza genitore . Tuttavia, poiché il progetto build.gradle fa riferimento a entrambi i progetti padre e figlio, la dipendenza transitoria non valida deve essere esclusa da entrambe le dipendenze, come @thoutbeckers indicato in precedenza.

Si noti che se non si desidera aggiungere l'esclusione a livello di configurazione (come @thoutbeckers ha mostrato nella risposta), è sempre possibile escludere la dipendenza transitiva da entrambe le dipendenze a cui è fatto riferimento, in modo esplicito.

+0

grazie! la tua risposta mi ha aiutato – Mustafa