Mavenに依存関係の最新バージョンを使用するように指示するにはどうすればよいですか?


788

Mavenでは、通常、依存関係は次のように設定されます。

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

現在、頻繁にリリースされるライブラリを使用している場合、<version>タグを常に更新するのはやや面倒です。Mavenに(リポジトリーから)常に利用可能な最新バージョンを使用するように指示する方法はありますか?


@Martin xyz-SNAPSHOT規約を知っていますが、最終バージョンでリポジトリにリリースされるライブラリ(つまり、dream-library-1.2.3.jarからdream-library-1.2.4.jarに移行する)について考えていました。 、 等々)。
アンダースサンドヴィグ2008

176
ビルドの再現性のために、この方法(またはバージョン範囲の使用)はお勧めしません。不明な理由で突然失敗するビルドは、バージョン番号を手動で更新するよりもずっと面倒です。
Pascal Thivent、2009

12
@PascalThivent連続リリースを行う場合、pomでリリース番号を手動で更新するのは面倒です。この問題を回避するには、scmプラグインと組み合わせたバージョンプラグインを使用します(私の回答を参照)。
アダム・ゲント

4
@PascalThiventどちらも面倒ですが、方法が異なります。私は自分の状況に応じてどちらかを選択し、どちらかを使用することを強制されないようにしたいと思います。
パイゲーム

回答:


745

注意:

この回答はMaven 2にのみ適用されます!言及したLATESTRELEASEmetaversionsはMavenの3で削除された「再現性のためには、構築し、」 6年前、。このMaven 3準拠のソリューションを参照してください


常に最新バージョンを使用したい場合、Mavenには2つのキーワードがあり、バージョン範囲の代わりに使用できます。使用しているプラ​​グイン/依存関係を制御できなくなるため、これらのオプションは注意して使用する必要があります。

プラグインまたは依存関係に依存している場合、LATESTまたはRELEASEのバージョン値を使用できます。LATESTは、特定のアーティファクトの最新リリースバージョンまたはスナップショットバージョンを指します。これは、特定のリポジトリに最後にデプロイされたアーティファクトです。RELEASEは、リポジトリ内の最後の非スナップショットリリースを指します。一般に、非特定バージョンのアーティファクトに依存するソフトウェアを設計することはベストプラクティスではありません。ソフトウェアを開発している場合は、サードパーティライブラリの新しいリリースがリリースされたときにバージョン番号を更新する必要がないように、RELEASEまたはLATESTを便利に使用できます。ソフトウェアをリリースするときは、プロジェクトが特定のバージョンに依存していることを常に確認し、ビルドまたはプロジェクトが制御下にないソフトウェアリリースの影響を受ける可能性を減らす必要があります。

詳細については、MavenブックPOM構文のセクションを参照してください。または、依存関係バージョンの範囲に関するこのドキュメントを参照してください。

  • 角括弧([])は「閉じた」(包括的)を意味します。
  • 括弧(())は「オープン」(排他的)を意味します。

以下は、さまざまなオプションの例です。Mavenリポジトリーでは、com.foo:my-fooには次のメタデータがあります。

<?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>

そのアーティファクトへの依存が必要な場合は、次のオプションがあります(もちろん、他のバージョン範囲を指定して、ここに関連するバージョンのみを表示できます)。

正確なバージョンを宣言します(常に1.0.1に解決されます):

<version>[1.0.1]</version>

明示的なバージョンを宣言します(Mavenが一致するバージョンを選択するときに、衝突が発生しない限り、常に1.0.1に解決されます)。

<version>1.0.1</version>

すべての1.xのバージョン範囲を宣言します(現在は1.1.1に解決されます):

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

制限のないバージョン範囲を宣言します(2.0.0に解決されます):

<version>[1.0.0,)</version>

バージョンをLATESTとして宣言します(2.0.0に解決されます)(Maven 3.xから削除)

<version>LATEST</version>

バージョンをRELEASEとして宣言します(1.1.1に解決されます)(maven 3.xから削除):

<version>RELEASE</version>

デフォルトでは、独自のデプロイによってMavenメタデータの「最新」のエントリが更新されますが、「リリース」エントリを更新するには、MavenスーパーPOMから「リリースプロファイル」をアクティブにする必要があります。「-Prelease-profile」または「-DperformRelease = true」のいずれかでこれを行うことができます


Mavenが依存関係バージョン(LATEST、RELEASE、およびバージョン範囲)を選択できるようにするアプローチでは、ビルド時の問題が発生する可能性があるため、それ以降のバージョンでは動作が異なる可能性がある(たとえば、依存関係プラグインが以前にデフォルトを切り替えたなど)値がtrueからfalseになり、結果が混乱します)。

したがって、一般に、リリースで正確なバージョンを定義することをお勧めします。ティムの答えは指摘し、Mavenの-バージョン-プラグインは依存関係のバージョン、特に更新するための便利なツールです使用-最新バージョン:バージョンバージョン:使用-最新リリースの目標を。


76
こんにちはリッチ!リリースと最新バージョンのマーカーはMaven 3.xではサポートされなくなったようです。
Pascal Thivent、2010

16
その非推奨は、ドキュメントを正しく理解していれば、通常の依存関係ではなくプラグインにのみ適用されるようです
Mond Raymond

9
@RichSellerちょっとリッチ; Maven 3.0でこれが利用できないことを理解する前に、これに少し時間を費やしました;)Maven 3.0の廃止を示すアップデートから開始するように回答を編集することを検討しますか?本当にありがとう!
Miquel 2013年

6
メジャーバージョンをロックして最新のマイナー(またはパッチ)バージョンを取得することをお勧めします(どちらかは、依存しているアーティファクトでのみバグ修正に使用されます)。現在の構文では、これは次のような範囲でのみ可能であるように見えます(注:括弧で始まり、括弧で終わります):[1.1,2.0)
Amr Mostafa

2
FWIW ... Maven3互換性に関する注意に更新されたリンク:cwiki.apache.org/confluence/display/MAVEN/...
dyodji

384

私はこのトピックが古いことを知っていますが、質問とOP提供の回答を読むと、Mavenバージョンプラグインが実際には彼の質問に対するより良い回答であったようです:

特に、次の目標が役立ちます。

  • versions:use-latest-versionsは、pomで新しいバージョンであるすべてのバージョンを検索し、最新バージョンに置き換えます。
  • versions:use-latest-releasesは、pomで新しいリリースであるすべての非SNAPSHOTバージョンを検索し、それらを最新のリリースバージョンに置き換えます。
  • versions:update-propertiesは、特定の依存関係の利用可能な最新バージョンに対応するように、プロジェクトで定義されたプロパティを更新します。これは、一連の依存関係をすべて1つのバージョンにロックする必要がある場合に役立ちます。

以下の他の目標も提供されています。

  • versions:display-dependency-updatesは、プロジェクトの依存関係をスキャンし、新しいバージョンが利用可能な依存関係のレポートを生成します。
  • versions:display-plugin-updatesは、プロジェクトのプラグインをスキャンし、新しいバージョンが利用可能なプラグインのレポートを生成します。
  • versions:update-parentは、プロジェクトの親セクションを更新して、利用可能な最新バージョンを参照するようにします。たとえば、企業のルートPOMを使用する場合、この目標は、企業のルートPOMの最新バージョンを使用していることを確認する必要がある場合に役立ちます。
  • versions:update-child-modulesは、プロジェクトの子モジュールの親セクションを更新して、バージョンが現在のプロジェクトのバージョンと一致するようにします。たとえば、集約するプロジェクトの親でもあるアグリゲーターpomがあり、子と親のバージョンが同期していない場合、このモジョは子モジュールのバージョンを修正するのに役立ちます。(バージョンが一致しないためにプロジェクトがひどく壊れてビルドできない場合は、この目標を実行するために-Nオプションを指定してMavenを呼び出す必要がある場合があります)。
  • versions:lock-snapshotsはpomですべての-SNAPSHOTバージョンを検索し、それらをその-SNAPSHOTの現在のタイムスタンプバージョンで置き換えます(例:-20090327.172306-4)。
  • versions:unlock-snapshotsは、pomですべてのタイムスタンプがロックされたスナップショットバージョンを検索し、それらを-SNAPSHOTに置き換えます。
  • versions:resolve-rangesは、バージョン範囲を使用して依存関係を検索し、使用されている特定のバージョンに範囲を解決します。
  • versions:use-releasesは、リリースされているすべての-SNAPSHOTバージョンをpomで検索し、対応するリリースバージョンで置き換えます。
  • versions:use-next-releasesは、pomで新しいリリースであったすべての非SNAPSHOTバージョンを検索し、次のリリースバージョンに置き換えます。
  • versions:use-next-versionsは、pomで新しいバージョンであるすべてのバージョンを検索し、次のバージョンに置き換えます。
  • versions:commitはpom.xml.versionsBackupファイル削除します。内蔵の「貧乏人のSCM」の半分を形成します。
  • versions:revertは、pom.xml.versionsBackupファイルからpom.xmlファイルを復元します。内蔵の「貧乏人のSCM」の半分を形成します。

将来の参考のために含めたいと思ったところです。


10
この文脈で、「リリース」と「バージョン」の違いは何ですか。
ベンノーランド

1
@BenNoland、この場合の違いは、次のバージョンがリリースアーティファクトである必要はないかもしれないということです。たとえば、バージョン1.0.0-SNAPSHOT、1.0.0、および1.0.1-SNAPSHOTのアーティファクト、および1.0.0-SNAPSHOTへのpom参照を指定すると、versions:next-versionsおよびversions:next-releasesは1.0.0に解決されます一方、versions:latest-versionsおよびversions:latest-releasesは、それぞれ1.0.1-SNAPSHOTおよび1.0.0に解決されます。
Ryan Beesley 2014年

1
バージョン/リリース/スナップショット間の不確実性は、こちらの非常に優れた表で解決できます:goo.gl/iDq6PK
Ev0oD

1
考えられるすべての無関係な目標を印刷しても役に立ちません。
MariuszS 2015

2
バージョン:use-latest-versionsはOPの問題のほとんどを解決すると思います。
Alex R

172

このページ(「依存関係バージョンの範囲」のセクション)をご覧ください。あなたがしたいかもしれないことは次のようなものです

<version>[1.2.3,)</version>

これらのバージョン範囲はMaven2に実装されています。


何らかの理由でこのオプションは機能しませんでした。範囲内のバージョンを選択しましたが、最新のバージョンは選択しませんでした。
ソリン

4
Mavenがバージョン番号を比較する方法を詳しく調べることをお勧めします。厳密なパターンに準拠していない場合、Mavenは数値ではなく文字列として比較します。
–ThorbjørnRavn Andersen 2013

そのページはCodehausにあり、「Maven 2.0にはまだ実装されていない」と説明しています... Mavenのドキュメント自体は、バージョン範囲について何も述べていません。何か不足していますか?バージョン範囲はいつ導入されましたか?公式ドキュメントのどこに記載されていますか?
シャノン

1
間違っています。バージョン範囲とは、1.2.3からそれ以降のすべてのバージョンに問題がないことを意味します。これはまったく最新バージョンではありません。
MariuszS 2015

@sorin問題のアーティファクトにも依存するプロジェクトの他の依存関係があったのでしょうか?それmvn dependency:tree -Dverboseを理解してみてください。これは予期しないバージョンを説明する可能性があります。
Eugene Beresovsky 16

83

他とは異なり、常に最新バージョンが必要になる理由はたくさんあると思います。特に、継続的な展開を行っており(1日に5つのリリースがある場合もある)、マルチモジュールプロジェクトを実行したくない場合。

私がすることは、Hudson / Jenkinsにビルドごとに次のことを行わせることです。

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

つまり、バージョンプラグインとscmプラグインを使用して依存関係を更新し、それをソース管理にチェックインします。はい、CIにSCMチェックインを実行させます(Mavenリリースプラグインの場合はとにかく行う必要があります)。

バージョンプラグインをセットアップして、必要なものだけを更新する必要があります。

<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>

私はリリースプラグインを使用して-SNAPSHOTを処理し、-SNAPSHOTのリリースバージョンがあることを検証するリリースを行います(これは重要です)。

あなたが私がすることをするなら、あなたはすべてのスナップショットビルドの最新バージョンとリリースビルドの最新リリースバージョンを手に入れるでしょう。ビルドも再現可能になります。

更新

このワークフローの詳細を尋ねるコメントに気づきました。この方法はもう使用しないと言いますが、Mavenバージョンのプラグインにバグがあり、一般に本質的に欠陥があるのはその大きな理由です。

バージョンプラグインを実行してバージョンを調整するには、pomを正しく実行するために、既存のすべてのバージョンが存在している必要があるため、欠陥があります。つまり、pomで参照されているバージョンが見つからない場合、バージョンプラグインは最新バージョンに更新できません。ディスク容量の理由で古いバージョンをクリーンアップすることが多いため、これは実際にはかなり煩わしいものです。

実際には、バージョンを調整するためにmavenとは別のツールが必要です(そのため、pomファイルに依存せずに正しく実行できます)。私はそのようなツールを卑しい言語であるバッシュで書いた。スクリプトは、バージョンプラグインなどのバージョンを更新し、pomをチェックしてソース管理に戻します。また、mvnバージョンプラグインよりも100倍高速に実行されます。残念ながら、それは一般向けに書かれたものではありませんが、人々が興味を持っているのであれば、私はそれを作り、要点またはgithubに入れることができます。

これが私たちがしていることであるといくつかのコメントが尋ねたのでワークフローに戻ります:

  1. 自分のリポジトリに20個ほどのプロジェクトがあり、ジェンキンスの仕事をしています
  2. Mavenをリリースするとき、リリースプラグインが使用されます。そのワークフローはプラグインのドキュメントで説明されています。mavenリリースプラグインはちょっと面倒です(そして私は親切です)が、機能します。ある日、この方法をより最適なものに置き換えることを計画しています。
  3. プロジェクトの1つがリリースされると、jenkinsは特別なジョブを実行し、次にすべてのバージョンの更新ジョブを呼び出します(jenkinsがリリースを認識する方法は、Maven jenkinsリリースプラグインもかなり扱いにくいため、複雑な方法です)。
  4. すべてのバージョンの更新ジョブは、20のプロジェクトすべてを認識しています。依存関係順にモジュールセクション内のすべてのプロジェクトを特定するのは、実際にはアグリゲータポンです。Jenkinsは、すべてのプロジェクトのバージョンを最新に更新し、pomをチェックインする(この場合も、モジュールセクションに基づいて依存関係の順序で行われます)マジックgroovy / bash fooを実行します。
  5. 各プロジェクトについて、pomが変更された場合(一部の依存関係でバージョンが変更されたため)、それがチェックインされ、すぐにjenkinsにpingして、そのプロジェクトに対応するジョブを実行します(これは、ビルドの依存関係の順序を維持するためです。 SCMポーリングスケジューラの)。

現時点では、リリースと自動バージョンを一般的なビルドとは別のツールにすることは良いことだと思います。

さて、上記の問題が原因でmavenはおかしいと思うかもしれませんが、これは、拡張可能な構文(別名XML)を解析しやすい宣言を持たないビルドツールでは実際にはかなり難しいでしょう。

実際、ネームスペースを介してカスタムXML属性を追加し、bash / groovyスクリプトのヒントを提供します(たとえば、このバージョンを更新しないでください)。


5
回答に動機(継続的な展開)を含めていただきありがとうございます。
David J. Liszewski、2012年

10
ここで重要な点は、ビルドがこの方法で再現可能であるということですが、バージョン範囲または-LATESTを使用する場合は再現できません。
marc.guenther

ビルドを実行する前に、プロジェクトpomに変更を加える外部ツールを使用してソリューションを2番目にしたいと思います。また、バージョン範囲プラグインは、バージョンだけでなく日付も考慮に入れるなど、本質的にバグがあるため、このアプローチを使用しています。
Daniel Hajduk

37

依存関係の構文は、依存関係バージョン要件仕様のドキュメントにあります。これは完全性のためです:

Dependenciesのversion要素は、有効な依存関係バージョンを計算するために使用されるバージョン要件を定義します。バージョン要件の構文は次のとおりです。

  • 1.0:1.0の「ソフト」要件(依存関係の他のすべての範囲と一致する場合は、単なる推奨事項)
  • [1.0]: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またはx> = 1.2; 複数のセットはカンマで区切られています
  • (,1.1),(1.1,):これは1.1を除外します(たとえば、このライブラリと組み合わせて機能しないことがわかっている場合)

あなたの場合、あなたは次のようなことをすることができます <version>[1.2.3,)</version>


15

開発中に明らかに大きく変化する開発バージョンに依存している可能性はありますか?

開発リリースのバージョンをインクリメントする代わりに、必要に応じて上書きするスナップショットバージョンを使用できます。これは、マイナーな変更ごとにバージョンタグを変更する必要がないことを意味します。1.0-SNAPSHOTのようなもの...

しかし、多分あなたは何か他のものを達成しようとしている;)


7

LATESTを使用している人は、必ず-Uを使用してください。そうしないと、最新のスナップショットがプルされません。

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories

-UIを使用している場合でも、Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
ロバート

7

この質問が提起された時点で、Mavenのバージョン範囲にいくつかの問題がありましたが、これらはMavenの新しいバージョンで解決されています。この記事では、バージョン範囲のしくみと、Mavenがバージョンを理解する方法をよりよく理解するためのベストプラクティスを詳しく説明しています。https//docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855


2
これは理論的には質問に答える可能性がありますが、答えの本質的な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
カールリヒター

6

真実は、3.xでも機能しますが、驚くべきことに、プロジェクトはビルドおよびデプロイされます。しかし、LATEST / RELEASEキーワードは、m2eおよびeclipseで問題を引き起こし、ALSOプロジェクトはLATEST / RELEASEを介してデプロイされた依存関係に依存しているため、バージョンを認識できません。

プロパティとしてバージョンを定義し、他の場所でそれを参照しようとした場合にも問題が発生します。

したがって、可能であれば、versions-maven-pluginを使用するという結論になります。


5

バージョンの範囲を使用したくない場合があります。特に、継続的な配信が行われていて、バージョンが大量にある場合(主に開発が激しい場合)は、依存関係を解決するのが「遅い」ようです。

回避策の1つは、versions-maven-pluginを使用することです。たとえば、プロパティを宣言できます。

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

そして、versions-maven-pluginをpomファイルに追加します。

<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>

次に、依存関係を更新するには、目標を実行する必要があります。

mvn versions:update-properties validate

1.1.1より新しいバージョンがある場合は、次のように表示されます。

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

3

Mavenが最新バージョンの依存関係を使用するようにしたい場合は、Versions Mavenプラグインとこのプラグインの使用方法を使用できます。Timはすでに良い答えを示しています。彼の答えに従ってください。

しかし、開発者として、私はこのタイプのプラクティスを推奨しません。どうして?

質問のコメントでPascal Thiventによってすでに与えられている理由への回答

ビルドの再現性のために、この方法(またはバージョン範囲の使用)はお勧めしません。不明な理由で突然失敗するビルドは、バージョン番号を手動で更新するよりもずっと面倒です。

私はこのタイプの練習をお勧めします:

<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>

保守もデバッグも簡単です。POMはすぐに更新できます。


versions-maven-pluginを使用する場合でも、ビルドは再現可能です。Mavenバージョンの更新は、別のコミットで実行できます(私の答えからわかるように、別の目標を指定する必要がありますが、ビルドで魔法のように発生するわけではありません)。
Markon、

1

Maven 3.5.4のMYソリューション、日食でネクサスを使用:

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

次に日食:atl + F5、そしてforce update of snapshots/release

わたしにはできる。


コマンドラインでは動作しませんが、理由は上記のさまざまな投稿で適切に述べられています。私たちの多くは自動化されたビルドに準拠する必要があるため、Eclipseだけでなく、コマンドラインで実行したときにPOMが機能する必要があります。
bigbadmouse 2018年

私はmaven 3.5.4を使用していて、 'latest'を使用しているときにこれを取得しました:LATESTまたはRELEASE(どちらも非推奨)@行154、列13
Leonardo Leonardo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.