W Maven zależności są zwykle konfigurowane w następujący sposób:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
Teraz, jeśli pracujesz z bibliotekami, które mają częste wydania, ciągłe aktualizowanie znacznika <version> może być nieco denerwujące. Czy jest jakiś sposób, aby powiedzieć Maven, aby zawsze korzystała z najnowszej dostępnej wersji (z repozytorium)?
java
maven
dependencies
maven-2
maven-metadata
Anders Sandvig
źródło
źródło
Odpowiedzi:
UWAGA:
Ta odpowiedź dotyczy tylko Maven 2! Wspomniane
LATEST
iRELEASE
metawersje zostały porzucone w Maven 3 „ze względu na powtarzalne wersje” ponad 6 lat temu. Zapoznaj się z tym rozwiązaniem zgodnym z Maven 3 .Jeśli zawsze chcesz używać najnowszej wersji, Maven ma dwa słowa kluczowe, których możesz użyć jako alternatywy dla zakresów wersji. Powinieneś używać tych opcji ostrożnie, ponieważ nie masz już kontroli nad wtyczkami / zależnościami, których używasz.
Aby uzyskać więcej informacji, zobacz sekcję POM Składnia książki Maven . Lub zobacz ten dokument na temat zakresów wersji zależności , gdzie:
[
&]
) oznacza „zamknięty” (włącznie).(
&)
) oznacza „otwarty” (wyłączny).Oto przykład ilustrujący różne opcje. W repozytorium Maven com.foo:my-foo ma następujące metadane:
Jeśli wymagana jest zależność od tego artefaktu, dostępne są następujące opcje ( oczywiście można określić inne zakresy wersji , pokazując tutaj tylko odpowiednie):
Zadeklaruj dokładną wersję (zawsze rozwiąże to 1.0.1):
Zadeklaruj jawną wersję (zawsze rozwiąże się do 1.0.1, chyba że nastąpi kolizja, gdy Maven wybierze pasującą wersję):
Zadeklaruj zakres wersji dla wszystkich wersji 1.x (obecnie rozwiąże to 1.1.1):
Zadeklaruj otwarty zakres wersji (rozwiąże się do wersji 2.0.0):
Zadeklaruj wersję jako NAJNOWSZĄ (rozwiąże się do 2.0.0) (usunięto z maven 3.x)
Zadeklaruj wersję jako RELEASE (rozwiąże się do 1.1.1) (usunięto z maven 3.x):
Zauważ, że domyślnie twoje własne wdrożenia aktualizują „najnowszy” wpis w metadanych Maven, ale aby zaktualizować wpis „release”, musisz aktywować „profil wydania” z super POM Maven . Możesz to zrobić za pomocą „-Prelease-profile” lub „-DperformRelease = true”
Warto podkreślić, że każde podejście, które pozwala Maven wybrać wersje zależności (NAJNOWSZE, WYDAWANIE i zakresy wersji) może pozostawić cię otwartym na problemy z budowaniem czasu, ponieważ późniejsze wersje mogą mieć inne zachowanie (na przykład wtyczka zależności wcześniej zmieniła domyślną wartość od true do false, z mylącymi wynikami).
Dlatego ogólnie dobrym pomysłem jest zdefiniowanie dokładnych wersji w wydaniach. Jak wskazuje odpowiedź Tima, wtyczka maven-wersje-wtyczka jest przydatnym narzędziem do aktualizowania wersji zależności, w szczególności wersji: użyj najnowszych wersji i wersji: użyj celów najnowszych wydań .
źródło
[1.1,2.0)
Teraz wiem, że ten temat jest stary, ale po przeczytaniu pytania i dostarczonej odpowiedzi OP wydaje się, że wtyczka Maven Versions Plugin mogła być lepszą odpowiedzią na jego pytanie:
W szczególności przydatne mogą być następujące cele:
Przewidziane są również następujące inne cele:
Pomyślałem, że dołączę to do każdego odniesienia w przyszłości.
źródło
Proszę spojrzeć na tę stronę (sekcja „Zakresy wersji zależności”). Możesz chcieć coś takiego
Te zakresy wersji są zaimplementowane w Maven2.
źródło
mvn dependency:tree -Dverbose
to rozgryźć. To może wyjaśniać nieoczekiwaną wersję.W przeciwieństwie do innych, myślę, że istnieje wiele powodów, dla których zawsze możesz chcieć najnowszej wersji. Zwłaszcza jeśli wykonujesz ciągłe wdrażanie (czasami mamy około 5 wydań dziennie) i nie chcesz wykonywać projektu wielomodułowego.
To, co robię, polega na tym, aby Hudson / Jenkins wykonał następujące czynności dla każdej kompilacji:
To znaczy używam wtyczki wersji i wtyczki scm do aktualizacji zależności, a następnie rejestruję ją w celu kontroli źródła. Tak, pozwalam CI na sprawdzanie SCM (co i tak musisz zrobić dla wtyczki maven release).
Będziesz chciał skonfigurować wtyczkę wersji, aby aktualizowała tylko to, co chcesz:
Używam wtyczki wydania, aby wykonać wydanie, które zajmuje się -SNAPSHOT i sprawdza, czy istnieje wersja -SNAPSHOT (co jest ważne).
Jeśli zrobisz to, co ja, otrzymasz najnowszą wersję dla wszystkich kompilacji migawek i najnowszą wersję dla kompilacji wersji. Twoje kompilacje będą również odtwarzalne.
Aktualizacja
Zauważyłem kilka komentarzy z pytaniem o specyfikę tego przepływu pracy. Powiem, że nie używamy już tej metody i główny powód, dla którego wtyczka wersji maven jest wadliwa i ogólnie jest wadliwa.
Jest wadliwy, ponieważ aby uruchomić wtyczkę wersji w celu dostosowania wersji, wszystkie istniejące wersje muszą istnieć, aby pom działał poprawnie. Oznacza to, że wtyczka wersji nie może zaktualizować się do najnowszej wersji czegokolwiek, jeśli nie może znaleźć wersji wymienionej w pom. Jest to w rzeczywistości dość denerwujące, ponieważ często usuwamy stare wersje ze względu na miejsce na dysku.
Naprawdę potrzebujesz oddzielnego narzędzia od maven, aby dostosować wersje (więc nie zależy od poprawnego działania pliku pom). Napisałem takie narzędzie w skromnym języku, jakim jest Bash. Skrypt zaktualizuje wersje takie jak wtyczka wersji i sprawdzi pom ponownie kontrolę źródła. Działa również 100 razy szybciej niż wtyczka wersji mvn. Niestety nie jest napisany w sposób do użytku publicznego, ale jeśli ludzie są zainteresowani, mógłbym to zrobić i umieścić to w gistubie lub githubie.
Wracając do przepływu pracy, ponieważ niektóre komentarze pytały o to, co robimy:
W tym momencie uważam, że dobrze jest, aby wydanie i wersja automatyczna były odrębnym narzędziem od ogólnej wersji.
Teraz myślisz Maven rodzaju bani z powodu wyżej wymienionych problemów, ale to faktycznie byłoby dość trudne z narzędziem budowy, który nie posiada deklaratywny łatwe do analizowania wysuwaną składni XML (aka).
W rzeczywistości dodajemy niestandardowe atrybuty XML poprzez przestrzenie nazw, aby pomóc podpowiedzieć skryptom bash / groovy (np. Nie aktualizuj tej wersji).
źródło
Składnia zależności znajduje się w dokumentacji specyfikacji wymagań wersji zależności . Tutaj jest dla kompletności:
W twoim przypadku możesz zrobić coś takiego
<version>[1.2.3,)</version>
źródło
Czy jesteś prawdopodobnie zależny od wersji programistycznych, które oczywiście bardzo się zmieniają podczas programowania?
Zamiast zwiększać wersję wydań programistycznych, możesz po prostu użyć migawki, którą w razie potrzeby zastępujesz, co oznacza, że nie będziesz musiał zmieniać tagu wersji przy każdej drobnej zmianie. Coś w stylu 1.0-SNAPSHOT ...
Ale może próbujesz osiągnąć coś innego;)
źródło
Kto kiedykolwiek używa NAJNOWSZY, upewnij się, że masz -U, w przeciwnym razie najnowsza migawka nie zostanie pobrana.
źródło
Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
Do czasu postawienia tego pytania pojawiły się pewne zagięcia z zakresami wersji w maven, ale zostały one rozwiązane w nowszych wersjach maven. W tym artykule bardzo dobrze przedstawiono działanie zakresów wersji i najlepsze praktyki, aby lepiej zrozumieć, w jaki sposób maven rozumie wersje: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
źródło
Prawda jest taka, że nawet w wersji 3.x nadal działa, co zaskakujące, projekty budują i wdrażają. Ale słowo kluczowe NAJNOWSZE / ZWOLNIENIE powodujące problemy w m2e i zaćmieniu w każdym miejscu, TAKŻE projekty zależą od zależności, która wdrożona przez NAJNOWSZE / WYDANIE nie rozpoznaje wersji.
Będzie to również powodować problemy, jeśli spróbujesz zdefiniować wersję jako właściwość i odwołać się do niej gdzie indziej.
Podsumowując, skorzystaj z pluginu-wersji-maven, jeśli możesz.
źródło
Czasami nie chcesz używać zakresów wersji, ponieważ wydaje się, że są one „powolne”, aby rozwiązać twoje zależności, szczególnie gdy istnieje ciągłe dostarczanie i jest mnóstwo wersji - głównie podczas ciężkiego rozwoju.
Jednym z obejść byłoby użycie wtyczki version-maven . Na przykład możesz zadeklarować właściwość:
i dodaj wersję-maven-plugin do pliku pom:
Następnie, aby zaktualizować zależność, musisz wykonać cele:
Jeśli istnieje wersja nowsza niż 1.1.1, powie Ci:
źródło
Jeśli chcesz, aby Maven powinien używać najnowszej wersji zależności, możesz użyć wtyczki Versions Maven i jak korzystać z tej wtyczki, Tim już udzielił dobrej odpowiedzi, postępuj zgodnie z jego odpowiedzią .
Ale jako programista nie będę polecał tego typu praktyk. DLACZEGO?
odpowiedz na pytanie, dlaczego Pascal Thivent podał już w komentarzu do pytania
Polecę ten rodzaj praktyki:
jest łatwy w utrzymaniu i debugowaniu. Możesz zaktualizować swój POM w mgnieniu oka.
źródło
MOJE rozwiązanie w maven 3.5.4, użyj nexusa, w zaćmieniu:
następnie w Eclipse:
atl + F5
i wybierzforce update of snapshots/release
mi to pasuje.
źródło