2010-07-02 24 views
11

Mam projekt, który zależy od artefaktu kontrolowanego przez dostawcę. Ten artefakt zawiera klasy, od których zależy, a niektóre są starsze i powodują problemy. Czy istnieje sposób, aby zmusić specjalistę do automatycznego rozszerzania słoika, usuwania klas i ponownego pakowania ich jako zależności? Spróbuję podać przykład.Wyklucz klasy z zależności w Maven

supplier:artifact:1.0.0 
com.supplier.useful.ClassA 
com.supplier.dto.ClassB (old) 

us:dependency:1.1.20 
com.supplier.dto.ClassB (new) 

us:project-web:1.1.20 
- supplier:artifact:1.0.0 
- us:dependency:1.1.20 

Tak - trzeba użyć ClassA w projekcie-web, ale muszę użyć ClassB z dependency artefaktu. Nie mogę zmodyfikować zależności dostawca: artefakt lub nas: dependency.

Jakieś pomysły ?!

Odpowiedz

8

Od wersji 2.0.9 maven zachowuje kolejność klasowania, więc jeśli zdefiniujesz klasę załataną w słoiku PRZED słojem dostawcy, ukryje implementację dostawcy.

Alternatywnie można spojrzeć na maven shade plugin, ponieważ robi dokładnie to, o co pytasz zgodnie ze mną.

5

Jeśli używasz Maven 2.0.9+, po prostu umieść swoją klasę w słoiku i zadeklaruj ją jako zależność przed artefaktem od twojego dostawcy. Jak wspomniano w @Peter, Maven używa kolejności pom dla ścieżki klasy od Mavena 2.0.9 (patrz MNG-1412/MNG-3111).

Jeśli z jakiegokolwiek powodu nie jesteś zadowolony z tego rozwiązania, a następnie można użyć Maven Dependency Plugin rozpakować zależność w target/classes (który powinien być na ścieżce klasy kompilacji) używając dependency:unpack z niektórymi excludes (patrz Unpacking specific artifacts). Nawet nie próbowałbym przepakować go, wprowadzi to bezużyteczną złożoność (zastąpienie starego słoika nowym na ścieżce klasy kompilacji nie będzie banalne, jeśli to wykonalne).