2015-12-10 22 views
7

Czy mogę skonfigurować Mavena tak, aby wybierał "najnowszą" zależność od konfliktu, a nie "najbliższą"?Maven ustanowiło strategię mediacji zależności od najnowszej, a nie najbliższej

z „najnowsza” jest domyślnym w bluszcz i innych sensownych menedżerów zależność, patrz http://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html

Uważam, że „najbliższy” strategia jest rzadko, co chcę.

Używam Maven 3.3.3, ale mogę zmienić wersje, jeśli to konieczne.

Wiem, w jaki sposób zastąpić wybór Mavena w przypadku poszczególnych konfliktów, ale wolałbym zmienić domyślne, tak aby nie musiałem wykrywać i naprawiać każdego konfliktu po jednym naraz.

(Patrz the Maven docs na Dependency „mediacji”)

+1

Jeśli mówisz, że rzadko nie chcesz, to jedna opinia. O ile mi wiadomo, nie ma prostego sposobu na zmianę tego zachowania ... To, co możesz zrobić, to dostarczyć łatkę, która zmienia zachowanie w Core Mavena ... Aby wykryć takie rzeczy, możesz użyć reguł egzekwowania w celu zidentyfikowania takich sytuacji. .. – khmarbaise

+2

[Ta dyskusja] (http://maven.40175.n5.nabble.com/Adding-support-for-new-dependency-mediation-strategy-td5768185.html) o wcześniejszej próbie dodania tej funkcji do Maven warto przeczytać. – heenenee

+3

Dzięki, @heenenee. Teraz widzę, dlaczego Maven nie ewoluował w ogóle w ciągu ostatnich 10 lat, wydaje się być całkowicie konający. Może spróbuję przełączyć mój projekt na SBT, który ma rozdzielczość rozwiązywania konfliktów najnowszej generacji i może zużywać deporty Mave i jest obsługiwany przez IntelliJ. – Rich

Odpowiedz

2

można skonfigurować Maven automatycznie korzystać z „najnowszej” wersji zależnością zamiast „najbliższego” podczas rozwiązywania konfliktów wersja?

Nie, nie można skonfigurować zależność strategii mediacji Maven do niczego innego niż najbliższy.

Dodanie configurable dependency mediation strategies has been proposed before, ale ostatecznie został opuszczony, ponieważ wniosek wymagał zmiany POM XSD, co nie miało miejsca od lat.

Dlaczego Maven domyślnie stosuje najbliższą strategię?

Strategia najbliższy jest faworyzowany przez Maven z dwóch powodów:

  1. Łatwy overriding poszczególnych konfliktów: Dla każdego konkretnego sprzeczne uzależnienia można określić jego wersję we własnej POM, a ta wersja staje się najbliższa.
  2. Powtarzalne buduje: To rzeczywiście byłoby to wynikiem konieczności version ranges w dowolnym miejscu wykresu zależności, ale strategia pośrednictwo „najnowsza” na pewno powiększać wpływ dowolnym zakresie Wersja kompilacji powtarzalności.

Ale naprawdę chcę innej strategii mediacji zależności. Co mogę zrobić?

Te są najlepsze opcje:

  1. Zrób rozszerzenie Maven: Wykorzystanie w "najbliższym" strategii jest określony przez NearestVersionSelector in MavenRepositorySystemUtils. Możesz ustawić create your own Maven extension, który definiuje własną VersionSelector, która implementuje wybraną strategię, a następnie w metodzie afterSessionStart twojego rozszerzenia, zamień sesję DependencyGraphTransformer na taką, która używa Twojego niestandardowego VersionSelector.
  2. Migracja do innego narzędzia do kompilacji: Oczywiście.
+0

Dzięki. Czy wtyczka do kompilacji nie może zmienić tego zachowania? To dałoby ścieżkę do zmiany tego bez zmiany POM XSD. – Rich

+0

Ten komentarz sugeruje, że wtyczka do budowania nie może zmieniać zależności: "Maven 3.x wprowadził zmiany w rozwiązaniu zależności, które uniemożliwiają optymalne działanie tej wtyczki." W Maven 3.x wszystkie zależności są rozwiązywane przed rozpoczęciem faz cyklu życia, co powoduje nie jest możliwe, aby plugin pobierał i instalował zewnętrzne zależności, zanim Maven rozwiąże zależności projektu. " https://github.com/UniversalMediaServer/external-maven-plugin#external-dependency-maven-plugin – Rich

+0

Do czego służy ta klasa? https://github.com/apache/maven/blob/master/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/NewestConflictResolver.java – Rich

1

Można również użyć "requireUpperBoundDeps" regułę dla Maven „Enforcer” wtyczki, które nie będą bezpośrednio wdrożenia „Newest wygrywa” politykę rozwiązywania konfliktów, ale wymusi że końcowy wynik jest taki sam. Konieczne będzie ręczne dodanie reguł zależnych <exclusions> lub <dependencyManagement> do POM, aby wybrać najnowszą zależność w każdym konflikcie, ale przynajmniej będziesz mieć pewność, że końcowy wynik to "najnowsze wygrane".

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
     <id>enforce</id> 
     <configuration> 
      <rules> 
      <requireUpperBoundDeps /> 
      </rules> 
     </configuration> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
Powiązane problemy