2014-09-11 12 views
6

tutaj jest urywek mojego build.gradle:Wykluczenie zależności transformacji Gradle nie działa zgodnie z oczekiwaniami. (Jak mogę pozbyć com.google.guava: guawy-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' 

który importuje wiele wersji guawa, jak można zobaczyć na 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) 

próbowałem usuwając zależność do: wykonując:

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

ale dependencyInsight pozostaje taka sama. Próbowałem też

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

ale znowu zależność wgląd pozostaje taka sama. Jak pozbyć się com.google.guava: guava-jdk5: 13.0?

Szczegóły: Próbowałem Gradle 1.2 i 2.1 w systemie Windows 8.1 box

Powodem dla mnie, aby spróbować to, aby pozbyć się tego wyjątku:

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

Czy ta biblioteka pojawia się, jeśli czyścisz i tworzysz linię komend (tzn. Bez udziału IDE)? – Nick

+0

Używam go przez linię poleceń. Błąd występuje tylko w czasie wykonywania. – unify

Odpowiedz

3

Okazuje się, że guava-jdk5 nadal jest utrzymywany.

Więc zmieniłem to:

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

na to:

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

A to moje stałe problemy, teraz mogę użyć klas z pakietu 'com.google.common' w Google App Projekt silnika ze wszystkimi opisanymi zależnościami

+1

Nie, wydaje mi się, że wariant JDK5 nie jest utrzymywany. Guava ma nie więcej niż 18,0, ale wariant jdk5 nie ma 18. Zobacz http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.google.guava%22%20AND%20a% 3A% 22guava-jdk5% 22 – Tom

16

Wygląda na to, że zależność nie zostanie wykluczona, jeśli istnieje jakaś zależność, która wskazuje na tę samą zależność bez żadnego z elementów wykluczających. des.

można wykluczyć zależność poprzez configuration Jednakże:

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

To zadziałało dla mnie. Dzięki! Ale osobiście nie podoba mi się sposób, w jaki gradle radzą sobie z zależnościami. Maven jest o wiele bardziej przejrzysty i prosty. –

3

Opierając się na @thoutbeckers odpowiedzieć ze względu na szczególny przypadek, w którym nie myślałem, że jego odpowiedź stosowane, ale to faktycznie. Mamy nadzieję, że ta odpowiedź pomoże innym osobom, które podzieliły się moim szczególnym problemem. Początkowo myślałem, że złe zależność przechodniów odwołuje się tylko do jednej zależności w pliku build.gradle, ale w rzeczywistości były one przywoływane przez dwie zależności. Wynikało to z faktu, że obie zależności, od których odnosi się zła zależność przechodnia, miały relację rodzic/dziecko, ale zauważyłem jedynie związek z zależnością podrzędną, a nie zależność nadrzędną.

Rozważmy następujący drzewa zależności (produkowany przez komendę 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 

z drzewa zależności, wygląda na to other.org:bad.transitive:dependency:0.9.1 odwołuje tylko przez jednego uzależnienia w pliku budować, a nie dwa.Załóżmy jednak, że plik Gradle wygląda następująco:

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

Dla złożyć Gradle jak ten powyżej, błąd będzie się utrzymywać, chociaż przechodnia zależność chciał wykluczyć występuje tylko w zależności od dziecka, nie zależność nadrzędny . Jednakże, , ponieważ zarówno projekty nadrzędne, jak i podrzędne są przywoływane przez plik build.gradle, zależność złej zależności przejściowej musi zostać wykluczona z obu zależności:, jak wspomniano powyżej @ postouterzy.

Należy zauważyć, że jeśli nie chcesz dodawać wykluczenia na poziomie konfiguracji (jak pokazały @teoutbeckers w swojej odpowiedzi), możesz zawsze po prostu wykluczyć przejściową zależność z obu zależności, do której się odwołuje, jawnie.

+0

dziękuję! Twoja odpowiedź mi pomogła. – Mustafa