Artefakty z zależności można wykluczyć, deklarując <exclusions>
element wewnątrz elementu a <dependency>
Ale w tym przypadku konieczne jest wykluczenie artefaktu odziedziczonego z projektu nadrzędnego. Oto fragment omawianego POM:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>jruby</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>ALL-DEPS</artifactId>
<version>1.0</version>
<scope>provided</scope>
<type>pom</type>
</dependency>
</dependencies>
</project>
base
artefakt, zależy javax.mail:mail-1.4.jar
i ALL-DEPS
zależy od innej wersji tej samej biblioteki. Ze względu na fakt, że mail.jar
from ALL-DEPS
istnieje w środowisku wykonawczym, chociaż nie jest eksportowany, koliduje z tym, mail.jar
który istnieje w rodzicu, który ma zasięg jako compile
.
Rozwiązaniem mogłoby być usunięcie mail.jar z macierzystego POM, ale większość projektów, które dziedziczą base, tego potrzebuje (podobnie jak zależność transtive dla log4j). Więc chciałbym po prostu wykluczyć bibliotekę rodzica z projektu podrzędnego , tak jak można by to zrobić, gdyby base
była zależnością, a nie pom-rodzicem:
...
<dependency>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
<type>pom<type>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Możesz zgrupować swoje zależności w ramach innego projektu z pakietowaniem,
pom
zgodnie z opisem w Sonatypes Best Practices :i odwołaj się do nich od swojego rodzica-pom (obserwuj zależność
<type>pom</type>
):Twój projekt podrzędny dziedziczy tę pompę rodzicielską jak poprzednio. Ale teraz zależność od poczty można wykluczyć w projekcie potomnym w
dependencyManagement
bloku:źródło
Nie używaj pompki dla rodziców
To może brzmieć ekstremalnie, ale w ten sam sposób, w jaki "piekło dziedziczenia" jest powodem, dla którego niektórzy ludzie odwracają się od programowania obiektowego (lub wolą kompozycję niż dziedziczenie ), usuń problematyczny
<parent>
blok i skopiuj i wklej wszystko,<dependencies>
czego potrzebujesz (jeśli twój zespół daje ci tej wolności).Założenie, że dzielenie poms na rodzica i dziecko w celu „ponownego użycia” i „uniknięcia zbędności” powinno zostać zignorowane i należy najpierw zaspokoić swoje najpilniejsze potrzeby (lekarstwo jest gorsze niż choroba). Poza tym redundancja ma swoje zalety - mianowicie niezależność od zmian zewnętrznych (czyli stabilność).
Jest to łatwiejsze niż się wydaje, jeśli wygenerujesz skuteczny pom (zapewnia go eclipse, ale możesz wygenerować go z wiersza poleceń za pomocą
mvn help:effective
).Przykład
Chcę użyć
logback
jako wiązania slf4j, ale mój macierzysty pom zawieralog4j
zależność. Nie chcę iść i muszę wpychać zależność innych dzieci od log4j do ich własnychpom.xml
plików, aby mój był niezakłócony.źródło
Przedefiniuj zależność (w pom dziecku) z
scope
systemem wskazującym na pusty słoik:Jar może zawierać tylko jeden pusty plik:
źródło
notepad empty.class
wtedy uruchomić,jar cvf empty.jar empty.class
aby wygenerować pusty słoik.Czy próbowałeś jawnie zadeklarować żądaną wersję mail.jar? Rozwiązanie zależności Maven powinno używać tego do rozpoznawania zależności w przypadku wszystkich innych wersji.
źródło
Najlepiej jest uczynić zależności, które nie zawsze chcesz dziedziczyć, nieprzechodnie.
Możesz to zrobić, zaznaczając je w pompie nadrzędnym z podanym zakresem.
Jeśli nadal chcesz, aby rodzic zarządzał wersjami tych dep, możesz użyć
<dependencyManagement>
tagu, aby ustawić żądane wersje bez jawnego ich dziedziczenia lub przekazywania tego dziedziczenia dzieciom.źródło
Kiedy wywołujesz pakiet, ale nie chcesz niektórych jego zależności, możesz zrobić coś takiego (w tym przypadku nie chciałem dodać starego log4j, ponieważ musiałem użyć nowszego):
To działa dla mnie ... ale java / maven jestem całkiem nowy, więc może nie jest optymalny.
źródło
Naprawdę musiałem zrobić tę brudną rzecz ... Oto jak
Przedefiniowałem te zależności z zakresem
test
. Zakresprovided
nie działa dla mnie.Używamy wtyczki Spring Boot do budowy słoika. Mamy wspólny moduł, który definiuje wspólne biblioteki, na przykład Springfox swagger-2. Moja super usługa musi mieć wspólnego rodzica (nie chce tego robić, ale zasady firmy obowiązują!)
Więc mój rodzic lub wspólnoty mają pom.
I mój super-serwisowy pom.
To jest rozmiar ostatniego artefaktu tłuszczu
Warto też wspomnieć o tej odpowiedzi - chciałem to zrobić, ale jestem leniwy ... https://stackoverflow.com/a/48103554/4587961
źródło
Możemy dodać rodzica pom jako zależność z typem pom i zrobić z tego wykluczenie. Bo tak czy owak pobierany jest macierzysty pom. To zadziałało dla mnie
źródło