2011-06-08 12 views
18

Po prostu przyzwyczaiłem się do tego, że w moich projektach nie używam żadnych niezadeklarowanych lub nieużywanych deklarowanych zależności. Chociaż bardzo trudno jest śledzić nieużywane zadeklarowane zależności środowiska wykonawczego/testowego, które są wymienione w zależności: analiza ... Wystarczy napisać do nich komentarze w pom.xml lub w inny sposób zarządzać nimi, aby wiedzieć, że są one potrzebne do testowania lub wykonywania.W jaki sposób Maven rozwiązuje konflikt wersji przechodniowych? nearest-wins strategy

Ale sposób rozwiązania konfliktu wersji wciąż jest dla mnie niejasny. Odnośnie przechodnich zależności.

Jak działa strategia najbliższej wygranej? Kiedy jedna wersja jest używana w innej wersji?

  • Jeśli zadeklarować Używany zależność niezgłoszonej z numerem wersji - zawsze wygrywa

  • Jeśli nie określa wersję zależność wprost, Maven nie można rozwiązać każdą wersją konfliktów, które mogą powstać w odniesieniu do tego uzależnienia (dziwne, ale napisany here)

  • Jeśli nie deklarują nierejestrowana stosować zależność, to wybiera przechodniej zależności od najbliższego poziomu (strategia Najbliższe-wins) i czy konflikt jest na tym samym poziomie, to jakoś decyduje b etween wersja A nad wersją B ... Być może pierwsza, która pojawia się podczas przetwarzania zależności, wygrywa

+0

Jeśli chcesz zdefiniować zależność dla testu, podaj ją również za pomocą zakresu, który działa również w środowisku wykonawczym. – khmarbaise

Odpowiedz

2

Myślę, że rozdzielczość zależności działa dokładnie w ten sam sposób, jak opisałeś.

Myślę też, jeśli użyć tagu <scope> dziecko do swojej <dependency>

jak cytowany z maven oficjalnej stronie twoje życie byłoby znacznie prostsze:

  1. kompilacji: Jest to zakres domyślny, używany, jeśli nie podano żadnego. Kompilacje zależności są dostępne we wszystkich ścieżkach klas projektu. Co więcej, te zależności są propagowane do projektów zależnych.
  2. pod warunkiem, że jest to podobne do kompilacji, ale oznacza, że ​​można oczekiwać, że JDK lub kontener będą zapewniać zależność w czasie wykonywania. Na przykład podczas budowania aplikacji WWW dla Java Enterprise Edition należy ustawić zależność od interfejsu API Servlet i powiązanych interfejsów API Java EE do podanego zakresu, ponieważ kontener WWW udostępnia te klasy. Ten zakres jest dostępny tylko w kompilacyjnej i testowej ścieżce klas i nie jest przechodni.
  3. Ten zakres wskazuje, że zależność nie jest wymagana do kompilacji, ale do wykonania. Jest w środowisku wykonawczym i testuje ścieżki klas, ale nie kompiluje ścieżki klasy.
  4. test: Ten zakres wskazuje, że zależność nie jest wymagana do normalnego korzystania z aplikacji i jest dostępna tylko dla fazy kompilacji testów i wykonania.
  5. system: Zakres ten jest podobny do podanego, z wyjątkiem tego, że należy jawnie podać JAR, który go zawiera. Artefakt jest zawsze dostępny i nie jest wyszukiwany w repozytorium.
  6. import: (dostępne tylko w Maven 2.0.9 lub nowszym) Ten zakres jest używany tylko w zależności od typu pom w sekcji. Wskazuje, że określony POM powinien zostać zastąpiony przez zależności w sekcji POM. Ponieważ są one zastępowane, zależności z zakresem importu faktycznie nie uczestniczą w ograniczaniu przechodniości zależności.
1

Istnieją pewne linki do dokumentacji zarządzania zależność:

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html (tabela importend w dziale „zakres uzależnienia”)

Istnieje artykuł bóg w niemieckim czasopiśmie które opisują rozwiązywanie zależności - oto sędzia BibTeX artykułu: http://www.bibsonomy.org/bibtex/2ef10bb1bc1be7806bc3fba53417bbd5f/funthomas424242

Istnieje sekcja o plugin zależność w książce sonatype adresem: http://www.sonatype.com/books/mvnex-book/reference/optimizing-sect-dependency-plugin.html

Mam nadzieję, że było pomocne.

Powiązane problemy