Mój projekt Gradle używa application
wtyczki do zbudowania pliku jar. W ramach zależności przechodnich środowiska uruchomieniowego w końcu ściągam org.slf4j:slf4j-log4j12
. (Jest to określane jako zależność przechodnia w co najmniej 5 lub 6 innych zależnościach przechodnich - ten projekt używa sprężyny i hadoopa, więc wszystko oprócz zlewu kuchennego jest wciągane ... nie czekaj ... to też jest :) ).
Chcę globalnie wykluczyć slf4j-log4j12
słoik z mojego zbudowanego słoika. Więc próbowałem tego:
configurations {
runtime.exclude group: "org.slf4j", name: "slf4j-log4j12"
}
Wydaje się jednak, że wyklucza to wszystkie org.slf4j
artefakty, w tym slf4j-api
. Podczas pracy w trybie debugowania widzę linie takie jak:
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).
Nie chcę wyszukiwać źródła każdej slf4j-log4j12
zależności przechodniej, a następnie umieszczać compile foo { exclude slf4j... }
w dependencies
bloku poszczególne instrukcje .
Aktualizacja:
Próbowałem też tego:
configurations {
runtime.exclude name: "slf4j-log4j12"
}
Co kończy się wykluczeniem wszystkiego z kompilacji! Jakbym sprecyzował group: "*"
.
Aktualizacja 2:
Używam do tego Gradle w wersji 1.10.
Odpowiedzi:
Ach, poniższe działa i robi to, co chcę:
Wygląda na to, że reguła wykluczania ma tylko dwa atrybuty -
group
imodule
. Jednak powyższa składnia nie zapobiega określaniu dowolnej właściwości jako predykatu. Podczas próby wykluczenia z indywidualnej zależności nie można określić dowolnych właściwości. Na przykład to się nie udaje:z
Więc nawet jeśli możesz określić zależność za pomocą a
group:
iname:
nie możesz określić wykluczenia za pomocąname:
!?!Może osobne pytanie, ale czym właściwie jest moduł ? Rozumiem pojęcie groupId: artifactId: wersja w Mavenie, co, jak rozumiem, przekłada się na grupę: nazwa: wersja w Gradle. Ale skąd mam wiedzieć, do jakiego modułu (mówiąc językiem stopniowym) należy dany artefakt Mavena?
źródło
configurations { runtime.exclude group: '*' }
.Aby wykluczyć jedną lub więcej bibliotek globalnie, dodaj następujący kod do pliku build.gradle
Teraz blok wykluczający ma dwie właściwości, grupę i moduł . Dla tych z Was, którzy pochodzą z maven background, group jest taka sama jak groupId, a module jest taka sama jak artifactId . Przykład: Aby wykluczyć com.mchange: c3p0: 0.9.2.1, należy dodać blok wykluczający
źródło
Twoje podejście jest prawidłowe. (W zależności od okoliczności, możesz chcieć użyć
configurations.all { exclude ... }
.) Jeśli te wykluczenia naprawdę wykluczają więcej niż jedną zależność (nigdy nie zauważyłem tego podczas ich używania), zgłoś błąd na http://forums.gradle.org najlepiej z powtarzalnym przykładem.źródło
configurations.all{}
jest dokładnie tym, czego szukałem. Dzięki za post Piotrw poniższym przykładzie wykluczam
źródło
Używałem spring boot 1.5.10 i próbuję wykluczyć logback, powyższe rozwiązanie nie działało dobrze, zamiast tego używam konfiguracji
źródło
Oprócz tego, co powiedział @ berguiga-mohamed-amine, właśnie odkryłem, że symbol wieloznaczny wymaga pozostawienia argumentu modułu pustego ciągu:
źródło