Jak zjistím Maven používat nejnovější verzi závislost?

hlasů
644

V Maven, závislosti jsou obvykle nastavit takto:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

Nyní, pokud pracujete s knihovnami, které mají časté úniky, neustále aktualizuje <verze> tag může být poněkud nepříjemné. Existuje nějaký způsob, jak zjistit Maven používat vždy nejnovější dostupnou verzi (z archivu)?

Položena 27/08/2008 v 17:17
zdroj uživatelem
V jiných jazycích...                            


12 odpovědí

hlasů
633

POZNÁMKA:

Tato odpověď se vztahuje na Maven jen 2! Zmíněná LATESTa RELEASEmetaversions byly vyřazeny v Maven 3 „kvůli reprodukovatelné staví“ , před více než 6 lety. Naleznete v tomto vyhovující řešení Maven 3 .


Chcete-li vždy používat nejnovější verzi, Maven má dvě klíčová slova, která lze použít jako alternativu k verzi rozsahy. Měli byste použít tyto volby s opatrností, protože již nejste v kontrole plugins / závislostí, které používáte.

Když jste závislí na plugin nebo závislost, můžete použít hodnotu, kterou verzi posledního nebo propuštění. POSLEDNÍ odkazuje na nejnovější propuštěn, nebo snímek verzi určitého artefaktu, naposledy nasazené artefaktu v určité úložiště. RELEASE se vztahuje k poslednímu vydání non-snímek v úložišti. Obecně platí, že to není nejlepší praxe navrhnout software, který spoléhá na non-konkrétní verzi artefakt. Pokud vyvíjíte software, možná budete chtít použít uvolnění nebo LATEST jako pohodlí, takže nemusíte aktualizovat čísla verzí, když je vydána nová verze knihovny třetích stran. Pustíte software, měli byste se vždy ujistit, že váš projekt je závislá na konkrétních verzí snížit šance na vaší stavbu nebo projektu je ovlivněn verzi softwaru není pod kontrolou. Používat nejnovější a spoušť s opatrností, pokud vůbec.

Viz část POM syntaxi Maven knihy pro více informací. Nebo vidět tento doc o závislost verze pásma , kde:

  • Čtverec konzola ( [a ]) znamená „uzavřené“ (včetně).
  • Závorky ( (a )) znamená "otevřít" (exclusive).

Zde je příklad ukazující různé možnosti. V Maven úložišti, com.foo:my-foo má následující metadata:

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

Pokud je požadována závislost na tomto artefaktu, máte následující možnosti (další verze rozsahy lze zadat samozřejmě jen ukazovat ty relevantní zde):

Prohlásit přesné verzi (vždy vyřešit 1.0.1):

<version>[1.0.1]</version>

Vyhlásit explicitní verzi (vždy vyřešit 1.0.1, pokud dojde ke kolizi, když Maven vybere verzi odpovídající):

<version>1.0.1</version>

Deklarovat rozsah verze pro všechny 1.x (budou v současné době řešit až 1.1.1):

<version>[1.0.0,2.0.0)</version>

Vyhlásit otevřenou rozsah verzí (vyřeší až 2.0.0):

<version>[1.0.0,)</version>

Prohlásit verzi as POSLEDNÍ (vyřeší až 2.0.0) (odstraněny z maven 3.x)

<version>LATEST</version>

Prohlásit verze jako uvolňování (vyřeší až 1.1.1) (odstraněny z maven 3.x):

<version>RELEASE</version>

Všimněte si, že ve výchozím nastavení bude vaše vlastní rozmístění aktualizovat „poslední“ záznam v metadatech Maven, ale aktualizovat „uvolnění“ položka, je třeba aktivovat „release-profil“ z Maven super-POM . To lze provést buď „-Prelease profilem“ nebo „-DperformRelease = true“


Je třeba zdůraznit, že jakýkoli přístup, který umožňuje Maven vybrat verze závislost (poslední, uvolnění a verze rozsahy) může nechat otevřít stavět problémy času, protože novější verze mohou mít různé chování (například závislost plugin již dříve přešel výchozí hodnota z true na false, s matoucích výsledky).

Proto je obecně dobrý nápad vymezit přesné verze v verzích. Jako Tim odpovědi poukazuje na to je Maven-versions-plugin je užitečný nástroj pro aktualizaci verze závislostí, zejména verzích: use-nejnovější verze a verze: use-poslední uvolňující cílů.

Odpovězeno 23/07/2009 v 15:58
zdroj uživatelem

hlasů
307

Teď vím, že toto téma je starý, ale čtení otázku a OP dodáván odpověď zdá se, že verze Maven plugin mohla ve skutečnosti být lepší odpověď na jeho otázku:

Zejména tyto cíle by mohly být užitečné:

  • verze: use-nejnovější verze prohledává pom pro všechny verze, které byly k dispozici novější verze a nahradí je s nejnovější verzí.
  • verze: use-nejnovější zprávy prohledává pom pro všechny verze non-Snapshot, které byly k dispozici novější vydání a nahradí je verze nejnovější vydání.
  • verze: update-vlastnosti aktualizuje vlastnosti definované v projektu tak, aby odpovídaly na nejnovější dostupnou verzi specifických závislostí. To může být užitečné v případě, že souprava závislostí musí být všechny zamčené jedné z verzí.

Tyto i další cíle jsou také k dispozici:

  • verze: display-závislost-updates skenuje závislostí projektu a vytváří zprávu o těchto závislostí, které mají k dispozici novější verze.
  • verze: display-plugin-aktualizace prohledá pluginy projektu a vytváří zprávu o těchto zásuvných modulů, které mají k dispozici novější verze.
  • verze: update-rodič aktualizuje rodičovskou část projektu tak, aby odkazoval na nejnovější dostupnou verzi. Například, pokud používáte firemní kořenový POM, tento cíl může být užitečné, pokud potřebujete, aby zajistily, že používáte nejnovější verzi podnikového kořenového POM.
  • verze: update-dítě-modules aktualizuje mateřský oddíl podřízených modulů projektu, takže verze odpovídá verzi aktuálního projektu. Například, pokud máte agregátor pom, který je také základní desky pro projekty, které agreguje a děti a rodiče verze rozejít, to mojo může pomoci opravit verze podřízených modulů. (Všimněte si budete muset vyvolat Maven s -N možností ke spuštění tohoto cíle, je-li váš projekt rozdělit tak špatně, že nemůže stavět, protože verze mis-match).
  • verze: lock-snapshots prohledává pom pro všechny verze -SNAPSHOT a nahradí je aktuální časové razítko verze tohoto -SNAPSHOT, např -20090327,172306-4
  • verze: odemknout-snapshots prohledává pom pro všechny časové razítko zamčené verze snímek a nahradí je -SNAPSHOT.
  • verze: Vyřešit gamma najde závislostí pomocí verze rozsahy a řeší řada na konkrétní verzi používán.
  • verze: use-uvolní prohledává pom pro všechny verze -SNAPSHOT, které byly propuštěny a nahradí je odpovídající verzi.
  • verze: use-next-vydání prohledává pom pro všechny verze non-Snapshot, které byly k dispozici novější vydání a nahradí je verze příštím vydání.
  • verze: use-příští verze prohledává pom pro všechny verze, které byly k dispozici novější verze a nahradí je další verzi.
  • verze: zavázat odebere soubory pom.xml.versionsBackup. Tvoří jednu polovinu vestavěného „chudáka SCM“.
  • verze: Vrátit obnoví soubory pom.xml ze souborů pom.xml.versionsBackup. Tvoří jednu polovinu vestavěného „chudáka SCM“.

Jen mě napadlo, že bych zahrnout jej pro budoucí reference.

Odpovězeno 23/07/2009 v 17:03
zdroj uživatelem

hlasů
162

Prosím, podívejte se na tuto stránku (sekce „Závislost Version rozsahy“). Co budete chtít udělat, je něco podobného

<version>[1.2.3,)</version>

Tyto verze rozsahy jsou realizovány v Maven2.

Odpovězeno 27/08/2008 v 17:56
zdroj uživatelem

hlasů
72

Na rozdíl od jiných Myslím, že existuje mnoho důvodů, proč byste mohli vždy chtějí nejnovější verzi. Zvláště pokud děláte kontinuální nasazení (někdy máme jako 5 zpráv v jeden den) a nechtějí dělat projekt multi-modulu.

To, co jsem udělat, je Hudson / Jenkins provést následující kroky pro každou verzi:

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true

To je Používám verze plug-inu a SCM plugin aktualizovat závislosti a pak se podívat do ovládacího prvku zdroje. Ano, jsem si nechal udělat CI SCM checkins (které budete muset udělat tak jako tak k uvolnění zásuvného maven).

Budete chtít nastavit verze plugin aktualizovat pouze to, co chcete:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>1.2</version>
            <configuration>
                <includesList>com.snaphop</includesList>
                <generateBackupPoms>false</generateBackupPoms>
                <allowSnapshots>true</allowSnapshots>
            </configuration>
        </plugin>

Používám plugin uvolnění dělat uvolňování, která se stará o -SNAPSHOT a ověřuje, že je vydání verze -SNAPSHOT (což je důležité).

Máte-li dělat to, co mám dělat, budete mít nejnovější verzi pro celý snímek staví a nejnovější vydání verze pro sestavení vydání. Váš staví bude také reprodukovatelné.

Aktualizace

Všiml jsem si nějaké připomínky ptá některá specifika tohoto pracovního postupu. Řeknu nemáme tuto metodu a už velký důvod, proč je naše verze Maven plugin je buggy a obecně je ve své podstatě chybná.

Je chybné, protože ke spuštění verze plug-inu pro nastavení verze všechny existující verze musejí existovat pro pom, aby správně fungoval. To je verze plugin nelze aktualizovat na nejnovější verzi cokoliv, pokud to nemůže najít verzi odkazovaný v pom. To je ve skutečnosti spíše nepříjemné, jak často vyčištění starých verzí pro disk z prostorových důvodů.

Opravdu je třeba samostatný nástroj z maven upravit verze (takže nejsou závislé na soubor pom správně spustit). Napsal jsem takový nástroj v pokorné jazyce, který je Bash. Skript bude aktualizovat verze, jako je verze zásuvného modulu a zkontrolujte pom zpět do ovládacího prvku zdroje. To také běží jako 100x rychleji než mvn verze plug-inu. Bohužel to není napsáno způsobem pro veřejné použití, ale pokud lidé mají zájem se mi to mohl udělat tak a dal ho do podstaty nebo github.

Vraťme se zpět do pracovního postupu, protože některé komentáře ptali, že to je to, co děláme:

  1. Máme 20 nebo tak projekty ve svých vlastních údajů s vlastními Jenkins pracovních míst
  2. Když jsme se uvolnit plugin uvolnění odborník je používán. Pracovní postup ze které je uvedeno v dokumentaci k Plugin. Uvolnění plugin maven druh sucks (a já jsem byl trochu), ale funguje to. Jednou jsme v plánu nahradí tuto metodu s něčím víc optimální.
  3. Když jeden z projektů dostane propuštěn Jenkins pak běží speciální úlohy budeme nazývat aktualizaci všech verzích práci (jak Jenkins zná své uvolnění je komplikovaný způsob, zčásti proto, že plugin Maven Jenkins verze je dost mizerný stejně).
  4. Aktualizace všech verzí práce dozví o všech 20 projektů. Je to vlastně agregátor pom být konkrétní všemi projekty v sekci modulů v závislosti pořadí. Jenkins provozuje naše kouzelné groovy / bash foo, který bude tahat všechny projekty aktualizovat verze na nejnovější a pak checkin na cedulky (zopakovat, aby závislost na základě části modulů).
  5. Pro každý projekt, pokud je pom změnila (z důvodu změny verze v některých závislostí) je kontrolována a pak jsme hned ping Jenkins spustit odpovídající práci pro tento projekt (to je zachovat sestavení závislost pořadí jinak jste vydáni na milost z SCM Poll plánovače).

V tomto bodě Jsem toho názoru, že je to dobrá věc, že ​​uvolnění a AUTO verze samostatný nástroj ze svého obecného sestavení tak jako tak.

Teď si asi myslíte, že odborník nějak vysává kvůli problémům uvedeným výše, ale to ve skutečnosti by bylo poměrně obtížné se stavební nástroj, který nemá deklarativní snadno rozebrat rozšiřitelné syntax (aka XML).

Ve skutečnosti jsme přidat vlastní atributy XML pomocí jmenných prostorů pomoci náznak bash / groovy skripty (např neaktualizují tuto verzi).

Odpovězeno 09/01/2012 v 22:21
zdroj uživatelem

hlasů
26

Syntaxe závislostí se nachází na požadavek specifikace závislost verze dokumentace. Zde se je pro úplnost:

Závislosti versionelement definuje požadavky na verze, které se používají k výpočtu efektivní verze závislostí. Požadavky verze mají následující syntaxi:

  • 1.0„Měkká“ požadavek na 1.0 (jen doporučení, pokud splňuje všechny ostatní rozsahy pro závislost)
  • [1.0]„Hard“ požadavkem na 1,0
  • (,1.0]: X <= 1,0
  • [1.2,1.3]: 1,2 <= x <= 1,3
  • [1.0,2.0): 1,0 <= x <2,0
  • [1.5,): X> = 1,5
  • (,1.0],[1.2,): X <= 1,0 a x> = 1,2; vícenásobné sady jsou odděleny čárkami
  • (,1.1),(1.1,): Vylučuje 1.1 (například, je-li známo, že pro práci v kombinaci s touto knihovnou)

Ve vašem případě, jsi to mohl udělat něco podobného <version>[1.2.3,)</version>

Odpovězeno 22/07/2015 v 16:21
zdroj uživatelem

hlasů
14

Jste pravděpodobně v závislosti na vývojových verzích, které zjevně hodně změnit během vývoje?

Namísto zvyšování verze vývojových verzích, mohl stačí použít snímek verzi, kterou v případě potřeby přepsat, což znamená, že nebude muset měnit verze značku na každé drobné změně. Něco jako 1,0-SNAPSHOT ...

Ale možná se snažíte dosáhnout něčeho jiného;)

Odpovězeno 27/08/2008 v 17:30
zdroj uživatelem

hlasů
6

Kdo někdy používá nejnovější a ujistěte se, že máte -U jinak nejnovější snímek nebude vytáhl.

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories
Odpovězeno 03/08/2015 v 08:38
zdroj uživatelem

hlasů
5

V době, kdy byla tato otázka položená tam byly některé Kinks s verzí pohybuje v maven, ale ty byly vyřešeny v novějších verzích Maven. Tento článek zachycuje velmi dobře, jak verze se pohybuje práce a osvědčených postupů, aby lépe pochopili, jak odborník chápe verze: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855

Odpovězeno 03/04/2015 v 16:00
zdroj uživatelem

hlasů
3

Pravdou je i v 3.x to ještě funguje překvapivě projekty staví a nasadí. Ale poslední / RELEASE klíčového slova způsobuje problémy v M2E a zatmění všude možně také projekty závisí na závislosti, které nasazena přes latest / ZPRÁVA nedokážou rozpoznat verzi.

Bude také způsobuje problém, pokud jste se snaží definovat verzi jako majetek, a odkazovat ji kdekoliv jinde.

Takže závěr je použít verze-Maven-plugin -li to možné.

Odpovězeno 26/06/2015 v 15:53
zdroj uživatelem

hlasů
2

Někdy nechcete používat verze rozsahy, protože se zdá, že mají vyřešit své závislostí „pomalu“, a to zejména v případě, že je kontinuální dodání v místě a tam jsou tuny verzích - hlavně při prudkém rozvoji.

Jedním z řešení by bylo použít verze-Maven-plugin . Například, můžete deklarovat vlastnost:

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

a přidejte verze-Maven-plugin do svého pom souboru:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

Potom, za účelem aktualizace závislost, budete muset provést cíle:

mvn versions:update-properties validate

Pokud existuje verze novější než 1.1.1, bude to říct:

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2
Odpovězeno 08/05/2017 v 15:59
zdroj uživatelem

hlasů
1

Mé řešení v maven 3.5.4, použijte nexus, v zatmění:

<dependency>
    <groupId>yilin.sheng</groupId>
    <artifactId>webspherecore</artifactId>
    <version>LATEST</version> 
</dependency>

pak zatmění: atl + F5a zvolteforce update of snapshots/release

to funguje u mě.

Odpovězeno 07/10/2018 v 03:52
zdroj uživatelem

hlasů
0

Pokud chcete, Maven by měl používat nejnovější verzi o závislost, pak můžete použít verze Maven Plugin a jak používat tento plugin, Tim již poskytla dobrou odpověď, následovat jeho odpověď .

Ale jako vývojář, nebudu doporučit tento typ praxe. PROČ?

Odpověď, proč je již dán Pascal Thivent v poznámce otázky

Opravdu nedoporučuji tuto praxi (ani pomocí verze se pohybuje) kvůli sestavení reprodukovatelnosti. Usazeniny, které začíná náhle selhat z neznámého důvodu je mnohem víc nepříjemné, než aktualizace ručně číslo verze.

Budu doporučovat tento typ praxe:

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

Je nenáročná na údržbu a snadné ladění. Můžete aktualizovat své POM v žádném okamžiku.

Odpovězeno 18/04/2018 v 09:10
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more