2014-09-11 1 views
6

hier ein Ausschnitt aus meiner build.gradle ist:Gradle Transitive Abhängigkeitsausschluss funktioniert nicht wie erwartet. (Wie kann ich von com.google.guava los: Guave-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' 

, die mehrere Version von Guave importiert, wie Sie mit sehen können 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) 

habe ich versucht, die Abhängigkeit zu entfernen: by doing:

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

aber die dependencyInsight bleibt gleich. Ich habe auch versucht

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

aber wieder Abhängigkeit Einsicht bleibt gleich. Wie kann ich com.google.guava: guava-jdk5: 13.0 loswerden?

Details: Ich habe versucht, gradle 1.2 und 2.1 auf einem Windows 8.1 Box

Der Grund für mich, zu versuchen, diese Ausnahme zu beseitigen:

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

Wird diese Bibliothek angezeigt, wenn Sie die Befehlszeile bereinigen und erstellen (d. H. Ohne dass eine IDE beteiligt ist)? – Nick

+0

Ich führe es über die Befehlszeile. Der Fehler tritt nur zur Laufzeit auf. – unify

Antwort

3

Es stellt sich heraus, dass Guava-jdk5 wird immer noch gepflegt.

Also änderte ich dies:

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

hierfür:

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

Und das meine Probleme behoben, habe ich jetzt Klassen aus dem 'com.google.common' Paket in Google App verwenden kann, Engine-Projekt mit allen beschriebenen Abhängigkeiten

+1

Nein, mir scheint, dass die JDK5-Variante nicht gepflegt wird. Guava ist bis zu 18.0, aber jdk5 Variante hat keine 18. Siehe http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.google.guava%22%20AND%20a% 3A% 22guava-jdk5% 22 – Tom

16

Es scheint, eine Abhängigkeit wird nicht ausgeschlossen, wenn es irgendwo eine andere Abhängigkeit gibt, die auf dieselbe Abhängigkeit ohne eines der Exclu verweist des.

Sie eine Abhängigkeit durch configuration jedoch ausschließen kann:

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

Das hat bei mir funktioniert. Vielen Dank! Aber ich persönlich mag nicht die Art, wie Gradle Abhängigkeiten behandeln. Maven ist viel klarer und einfacher. –

3

Aufbauend auf @thoutbeckers aufgrund eines speziellen Fall zu beantworten, wo ich hätte nicht gedacht, dass seine Antwort angewendet, aber es hat tatsächlich. Hoffentlich kann diese Antwort anderen helfen, die mein Sonderfallproblem geteilt haben. Ursprünglich dachte ich, dass die schlechte transitive Abhängigkeit nur durch eine Abhängigkeit in der Datei build.gradle referenziert wurde, aber tatsächlich wurde sie durch zwei Abhängigkeiten referenziert. Dies lag daran, dass beide Abhängigkeiten, auf die die schlechte transitive Abhängigkeit referenziert wurde, eine Eltern/Kind-Beziehung hatten, aber ich bemerkte nur die Beziehung mit der Kind-Abhängigkeit und nicht die Eltern-Abhängigkeit.

Betrachten Sie den folgenden Abhängigkeitsbaum (erzeugt durch den Befehl 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 

Aus dem Abhängigkeitsbaum, es sieht aus wie die other.org:bad.transitive:dependency:0.9.1 wird nur von einer Abhängigkeit in Ihrer Build-Datei referenziert, nicht zwei.Allerdings nehme Ihre Gradle Datei wie folgt aussieht:

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

Für eine Gradle Datei wie die oben, wird der Fehler bestehen bleiben, auch wenn die transitive Abhängigkeit Sie tritt nur in der Kinder Abhängigkeit ausschließen wollte, nicht die übergeordnete Abhängigkeit . Jedoch, , da sowohl das übergeordnete als auch das untergeordnete Projekt von der build.gradle-Datei referenziert werden, muss die schlechte transitive Abhängigkeit von beiden Abhängigkeiten ausgeschlossen werden, wie @thoughts oben angegeben.

Beachten Sie, dass Sie die transitive Abhängigkeit von den beiden Abhängigkeiten, auf die explizit verwiesen wird, immer ausschließen können, wenn Sie den Ausschluss nicht auf der Konfigurationsebene hinzufügen möchten (wie @thoutbeeckers in ihrer Antwort gezeigt hat).

+0

danke! Deine Antwort hat mir geholfen. – Mustafa

Verwandte Themen