2011-01-17 8 views
62

Próbuję znaleźć "ogólny" sposób wykluczenia przechodniowej zależności od bycia włączonym bez konieczności wykluczania go ze wszystkich zależnych od niego zależności. Na przykład, jeśli chcę, aby wykluczyć slf4j, mam następujące:Czy istnieje sposób na globalne wykluczenie zależności Maven?

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-jmx</artifactId> 
    <version>3.3.2.GA</version> 
    <exclusions> 
     <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 
    <dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>3.4.0.GA</version> 
    <type>jar</type> 
    <exclusions> 
     <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 

Jest to częściowo oczyścić plik POM, częściowo aby uniknąć problemów w przyszłości z osobami dodanie zależności, które zależą od tego wykluczyć uzależnienia - i zapominając o wykluczeniu go.

Czy istnieje sposób?

+2

nie rozwiązuje problemu, ale Maven-egzekutor-plugin ma A [zakazane zależności funkcji] (https://maven.apache.org/ enforcer/enforcer-rules/bannedDependencies.html), które zawiedzie budowanie, jeśli wkradną się niechciane zależności. Nadal musisz je ręcznie wykluczyć, jednak: -/ – dnault

+0

Alternatywna odpowiedź jest dostępna tutaj: http://stackoverflow.com/a/39979760/363573 – Stephan

Odpowiedz

49

Czy to pomaga? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

„Zakładając, że chcę, aby wykluczyć avalon-ramy z moja wojna, chciałbym dodać następujące moich projektów POM z zakresu warunkiem. To działa na wszystkich przechodnich zależnościach i pozwala określić go raz.

<dependencies> 
    <dependency> 
     <artifactId>avalon-framework</artifactId> 
     <groupId>avalon-framework</groupId> 
     <version>4.1.3</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

Działa to nawet podczas określania go w macierzystym POM, co uniemożliwiłoby projektom deklarowanie tego we wszystkich podrzędnych POM. "

+1

Zrobiło się świetnie, idealnie! –

+36

To wciąż tylko częściowy hack - zależność nie skończy się wewnątrz artefaktu budowy, ale nadal jest dostępna podczas testów. –

+0

@TuukkaMustonen A co z zasięgiem "środowiska wykonawczego" zamiast zakresu 'provided'? – Stephan

14

stworzyłem pusty słoik i stworzył tę zależność:

<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <scope>system</scope> 
    <systemPath>${basedir}/src/lib/empty.jar</systemPath> 
    <version>0</version> 
</dependency> 

nie jest doskonały, ponieważ od teraz masz pusty słoik na swojej drodze kompilacji/testów. Ale to tylko kosmetyczne.

3

Dla przypomnienia, oto odpowiedź z Maven oficjalnej dokumentacji:

Dlaczego wyłączenia dokonywane są na podstawie na uzależnienia, a nie na poziomie POM

to głównie zrobić, aby upewnić się, że wykres zależności jest przewidywalny, i aby utrzymać efekty dziedziczenia z wykluczeniem zależności, które nie powinny być wykluczone. Jeśli dojdziesz do metody ostatniej instancji i będziesz musiał zastosować wykluczenie, powinieneś być całkowicie pewien, która z twoich zależności powoduje niepożądaną zależność przechodnią.

Jeśli ktoś chce, aby budować bardziej wytrzymałe, zakres wersja mogą być użyte. Dzięki temu żadna nowsza wersja zależności nie może zakłócać projektu.

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>[1.4.2,)</version> 
    <scope>provided</scope> 
</dependency> 

Każda wersja slf4j-api> = 1.4.2 będą uważane za oferowane (w zestawie) w czasie wykonywania, albo samego albo pojemnika JDK.

Referencje

2

Aby rozwinąć na dnault's comment:

każdy może użyć Maven Enforcer plugin's Banned Dependencies rule aby zapewnić zależności są wykluczone. Trzeba jeszcze wykluczyć je ręcznie, ale kompilacja nie powiedzie się, jeśli ktoś przez pomyłkę doda zależność w innym miejscu.

<dependencies> 
    <dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-jmx</artifactId> 
    <version>3.3.2.GA</version> 
    <exclusions> 
     <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 
</dependencies> 

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     <configuration> 
      <rules> 
      <bannedDependencies> 
       <excludes> 
       <exclude>org.slf4j:slf4j-api</exclude> 
       </excludes> 
      </bannedDependencies> 
      </rules> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
</plugins> 

również jest otwarty żądanie cecha: MNG-1977 Global dependency exclusions