2015-02-10 7 views
25

Używam dwóch następujących zależności:Jak zmusić Gradle do ustawienia tej samej wersji dla dwóch zależności?

compile 'com.google.guava:guava:14.0.1' 
compile 'com.google.guava:guava-gwt:14.0.1' 

oba muszą być takie same w wersji działało poprawnie. Ponieważ moje inne zależności używają wyższej wersji, Gradle używa różnych wersji dla każdej zależności.

Znalazłem to uruchamiając gradle dependencies:

compile - Compile classpath for source set 'main'. 
+--- com.google.guava:guava:14.0.1 -> 17.0 
+--- com.google.guava:guava-gwt:14.0.1 
| +--- com.google.code.findbugs:jsr305:1.3.9 
| \--- com.google.guava:guava:14.0.1 -> 17.0 

Jak mogę zmusić Gradle ustawić tę samą wersję dla tych dwóch zależności?

Odpowiedz

6

Jedna z twoich zależności wymusza aktualizację wersji guava. Użyj opcji gradle dependencies, aby zlokalizować bibliotekę, która eksmituje twoją wersję.

Problem polega na tym, że jeśli zmusisz go do użycia 14.0.1, inna biblioteka może nie działać poprawnie. Czy nie możesz po prostu użyć wersji 17.0 jako swojej zależności?

Zamiast utrzymywać indywidualne numery wersji w build.gradle, używam pliku dependencies.gradle, który będzie mapował numery wersji i wciągał je do build.gradle. W ten sposób muszę utrzymać tylko jedną wersję guava. Więc przykładem będzie:

dependencies.gradle

ext { 
    ver = [ 
     guava: '14.0.1' 
    ] 
} 

a następnie w pliku build.gradle można mieć:

apply from: "dependencies.gradle" 

dependencies { 
    compile group: 'com.google.guava', module: 'guava', version: ver.guava 
    compile group: 'com.google.guava', module: 'guava-gwt', version: ver.guava 
} 

wtedy, kiedy chce się przenieść do 17,0 Muszę tylko zmienić dependencies.gradle.

jestem także zdecydowanym fanem ustawienie przechodnie zależności false z

configurations.compile { transitive = false } 

ten sposób nie mają pewne zależności eksmitowany w czasie kompilacji, choć może masz problem w czasie wykonywania, jeśli biblioteka eksmisji nie jest w pełni kompatybilny wstecz. Spójrzmy prawdzie w oczy, jeśli piszesz kod, powinieneś wiedzieć, jakich bibliotek używasz i powinieneś jasno mówić o swoich zależnościach. Chroni Cię przed jedną z twoich zależności uaktualniających i denerwujących cię.

34
configurations.all { 
    resolutionStrategy { 
     force 'com.google.guava:guava:14.0.1' 
     force 'com.google.guava:guava-gwt:14.0.1' 
    } 
} 
+10

Gdzie umieścić to w pliku gradle? Na dole bloku? –

+0

Nadal dostaję błędy takie jak: 'Wykonanie nie powiodło się dla zadania ': transformClassesWithJarMergingForDebug'. > com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplikat wpisu: com/google/android/gms/gcm/GoogleCloudMessaging $ 1.class' –

+0

@IgorGanapolsky Lokalizacja nie ma znaczenia, ale umieściłbym go blisko szczytu. – cmcginty

15

Miałem podobną sytuację, w której jedna z zależności użyła wiosną 4.2.4, która została uszkodzona. Musisz wymusić określoną wersję biblioteki, którą chcesz. Jak wspomniano w innym komentarzu, może to powodować problemy ze zgodnością, ale czasami jest to konieczne.

najmniej inwazyjnym sposobem na wymuszenie wersję biblioteki znalazłem zamiast korzystania

compile "org.springframework:spring-web:4.2.3.RELEASE" 

określający konfigurację zależnościach jako wymuszone:

compile("org.springframework:spring-web:4.2.3.RELEASE"){ 
    force = true 
} 

Używałem go, kiedy potrzebne do downgrade wersji Wiosna tymczasowo (do następnego wydania).

+0

To jest właściwa odpowiedź! – Natix

17
configurations.all { 
    resolutionStrategy { 
    eachDependency { DependencyResolveDetails details -> 
     if (details.requested.group == 'com.google.guava') { 
     details.useVersion "14.0.1" 
     } 
    } 
    } 
} 

dependencies { 
    compile 'com.google.guava:guava' 
    compile 'com.google.guava:guava-gwt' 
} 
+0

ten działa dla mnie – Meta

1

Alternatywnie można użyć dependencySets (lub mavenBom gdy BOM POM jest dostępny) wsparcie w wiosna-zależność zarządzania Gradle wtyczki. Zauważ, że ta wtyczka jest również automatycznie stosowana wraz z wiosennym buforem Gradle. Aby uzyskać więcej informacji, patrz here.

plugins { 
    id 'io.spring.dependency-management' version '1.0.1.RELEASE' 
} 

dependencyManagement { 
    dependencies { 
    dependencySet(group: 'com.google.guava', version: '14.0.1') { 
     entry 'guava' 
     entry 'guava-gwt' 
    } 
    } 
} 

dependencies { 
    compile 'com.google.guava:guava' 
    compile 'com.google.guava:guava-gwt' 
} 
0

Jeśli jest OK, po prostu użyć nowszej wersji zarówno zależne, najprostszy sposób, aby rozwiązać Twój problem jest zaktualizować zależności:

compile 'com.google.guava:guava:17.0' 
compile 'com.google.guava:guava-gwt:17.0' 

To będzie upewnić się zarówno z nich jest 17,0. To prostsze, niż próba zmuszenia ich obu do starszej wersji, a jako dodatkowy bonus dostajesz nowszą wersję, która (prawdopodobnie) zawiera poprawki błędów i nowe funkcje.

Aby być uczciwym, @Klunk wspomina o tym w swojej odpowiedzi, zadając pytanie: "Czy nie możesz użyć wersji 17.0 jako swojej zależności?", Ale jest to po prostu przejściowe i łatwe do przeoczenia, więc pomyślałem, że warto jako osobna odpowiedź.