W Maven2, aby wykluczyć jedną zależność przechodnią, muszę zrobić coś takiego:
<dependency>
<groupId>sample.group</groupId>
<artifactId>sample-artifactB</artifactId>
<version>1</version>
<exclusions>
<exclusion>
<groupId>sample.group</groupId>
<artifactId>sample-artifactAB</artifactId>
</exclusion>
</exclusions>
</dependency>
Problem z tym podejściem polega na tym, że muszę to robić dla każdej zależności przechodniej wniesionej przez sample-artifactB
.
Czy istnieje sposób użycia jakiegoś symbolu wieloznacznego, aby wykluczyć wszystkie zależności przechodnie na raz zamiast jeden po drugim?
maven-2
dependencies
pbreault
źródło
źródło
Odpowiedzi:
W przypadku maven2 nie ma sposobu na robienie tego, co opisujesz. Dla maven 3 jest. Jeśli używasz maven 3, zobacz inną odpowiedź na to pytanie
W przypadku maven 2 zaleciłbym utworzenie własnego niestandardowego pom dla zależności, która zawiera <wykluczenia>. W przypadku projektów, które muszą korzystać z tej zależności, ustaw zależność na niestandardową pompę zamiast na typowy artefakt. Chociaż niekoniecznie pozwala to na wykluczenie wszystkich zależności przechodnich za pomocą pojedynczego <wykluczenia>, pozwala tylko napisać swoją zależność tylko raz, a wszystkie projekty nie muszą utrzymywać niepotrzebnych i długich list wykluczeń.
źródło
To, co zadziałało dla mnie (może być nowsza funkcja Maven), to po prostu stosowanie symboli wieloznacznych w elemencie wykluczenia.
Mam projekt wielomodułowy, który zawiera moduł „aplikacji”, do którego odwołują się dwa moduły z pakietem WAR. Jeden z tych modułów z pakietami WAR tak naprawdę potrzebuje tylko klas domen (i nie oddzieliłem ich jeszcze od modułu aplikacji). Znalazłem to do pracy:
Symbol wieloznaczny zarówno dla groupId, jak i artefactId wyklucza wszystkie zależności, które normalnie byłyby propagowane do modułu przy użyciu tej zależności.
źródło
Jedna rzecz, którą uważam za przydatną:
Jeśli umieścisz zależność z wykluczeniami w sekcji dependenceManagement macierzystej POM dla swojego projektu lub w importowanej POM POM do zarządzania zależnościami, nie musisz powtarzać wykluczenia (ani wersji).
Na przykład, jeśli twoja nadrzędna POM ma:
Następnie moduły w projekcie mogą po prostu zadeklarować zależność jako:
W macierzystej POM określi zarówno wersję, jak i wykluczenia. Używam tej techniki do prawie wszystkich naszych projektów i eliminuje to wiele powtórzeń.
źródło
Trzy lata temu zalecałem używanie wersji 99 nie istnieje, ale teraz wymyśliłem lepszy sposób, zwłaszcza, że wersja 99 jest offline:
W macierzystej POM projektu użyj wtyczki maven-enforcer-plug, aby zakończyć kompilację, jeśli niechciana zależność wkradnie się do kompilacji. Można to zrobić za pomocą reguły zakazanych zależności wtyczki :
Następnie, gdy ostrzeże Cię o niechcianej zależności, wyklucz ją w sekcji nadrzędnej POM
<dependencyManagement>
:W ten sposób niechciana zależność nie pojawi się przypadkowo (w przeciwieństwie do tej,
<exclusion>
którą łatwo zapomnieć), nie będzie dostępna nawet podczas kompilacji (w przeciwieństwie doprovided
zakresu), nie ma fałszywych zależności (w przeciwieństwie do wersji 99) i „ Będę działać bez niestandardowego repozytorium (w przeciwieństwie do wersji 99). Takie podejście będzie działać nawet w oparciu o wersję artefaktu, klasyfikatory, zakres lub całą grupę ID - szczegółowe informacje można znaleźć w dokumentacji .źródło
<configuration>
jest on ignorowany podczas wykonywania celu z linii poleceń i musi zostać przeniesiony bezpośrednio pod<plugin>
.<dependencyManagement>
. Uruchomieniemvn dependency:tree
w tym konkretnym projekcie nie będzie miało żadnej wykluczonej zależności. Ale wszystkie projekty importujące tę zależność nie będą honorować<exclusions>
drugiego projektu nadrzędnego pom - wykluczony wkradnie się !!! Musiałem przejść bezpośrednio<exclusions>
do każdego modułu pom.Korzystam z następującego obejścia: zamiast próbować wykluczyć artefakt we wszystkich odpowiednich zależnościach, rysuję zależność jako „pod warunkiem” na najwyższym poziomie. Na przykład, aby uniknąć wysyłania „dowolnej wersji” xml-apis:
źródło
Obecnie nie ma możliwości wykluczenia więcej niż jednej zależności przechodnie na raz, ale na stronie Maven JIRA jest prośba o tę funkcję:
https://issues.apache.org/jira/browse/MNG-2315
źródło
Istnieje obejście tego problemu, jeśli ustawisz zakres zależności na środowisko wykonawcze , zależności przechodnie zostaną wykluczone. Pamiętaj jednak, że oznacza to konieczność dodatkowego przetwarzania, jeśli chcesz spakować zależność środowiska wykonawczego.
Aby uwzględnić zależność środowiska wykonawczego w dowolnym opakowaniu, możesz użyć celu kopiowania wtyczki maven-zależności dla określonego artefaktu .
źródło
<scope>provided</scope>
zamiast tego<scope>runtime</scope>
.jeśli chcesz wykluczyć wszystkie zależności przechodnie z artefaktu zależności, który zamierzasz dołączyć do zestawu, możesz to określić w deskryptorze wtyczki zestawu:
źródło
Jeśli tworzysz w środowisku Eclipse, możesz w wykresie zależności Edytora POM (włączone karty zaawansowane) szukać zależności, którą chcesz wykluczyć z projektu, a następnie:
kliknij na niego prawym przyciskiem myszy -> „Wyklucz artefakt Maven ...”, a Eclipse zrobi dla ciebie wykluczenie bez potrzeby sprawdzania, z którą zależnością jest połączona biblioteka lib.
źródło
Jaki jest powód wyłączenia wszystkich zależności przechodnich?
Jeśli istnieje konkretny artefakt (taki jak logowanie wspólne), który należy wykluczyć z każdej zależności, pomocne może być podejście w wersji 99 nie istnieje .
Aktualizacja 2012: nie używaj tego podejścia. Użyj wtyczki maven-enforcer i wykluczeń . Wersja 99 wytwarza fałszywe zależności, a repozytorium wersji 99 jest offline (istnieją podobne kopie lustrzane, ale nie można na nich polegać, aby pozostać online na zawsze; najlepiej używać tylko Maven Central).
źródło
W zagadnieniu podobnym zadeklarowałem pożądaną zależność z podanym zakresem. Przy takim podejściu przechodnie są pobierane, ale NIE są uwzględniane w fazie pakietu, co jest tym, czego chcesz. Podoba mi się również to rozwiązanie pod względem konserwacji, ponieważ nie ma pom lub niestandardowego pom, jak w rozwiązaniu whaley, wymaganego do utrzymania; wystarczy podać konkretną zależność w kontenerze i gotowe
źródło
Użyj najnowszego maven na swojej ścieżce klasy. Usunie to zduplikowane artefakty i zachowa najnowszy artefakt maven.
źródło