855

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

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

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

4

12 に答える 12

800

ノート:

言及さLATESTれたメタバージョンは、6年以上前に、「再現可能なビルドのために」Maven3RELEASEプラグイン依存関係のために削除されました。(通常の依存関係では引き続き完全に機能します。)プラグインの依存関係については、このMaven3準拠のソリューションを参照してください。


常に最新バージョンを使用したい場合、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メタデータの「最新」エントリーを更新しますが、「release」エントリーを更新するには、MavenスーパーPOMから「release-profile」をアクティブ化する必要があることに注意してください。これは、「-Prelease-profile」または「-DperformRelease=true」のいずれかを使用して実行できます。


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

したがって、一般的に、リリースで正確なバージョンを定義することをお勧めします。Timの回答が指摘しているように、maven -versions-pluginは、依存関係のバージョン、特にversions:use-latest-versionsおよびversions:use-latest-releasesの目標を更新するための便利なツールです。

于 2009-07-23T14:58:06.890 に答える
413

今、私はこのトピックが古いことを知っていますが、質問とOPが提供する回答を読むと、実際にはMaven Versions Pluginが彼の質問に対するより良い回答だったようです:

特に、次の目標が役立つ可能性があります。

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

次の他の目標も提供されます。

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

将来の参考のためにそれを含めようと思っただけです。

于 2009-07-23T16:03:56.340 に答える
173

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

<version>[1.2.3,)</version>

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

于 2008-08-27T16:56:03.053 に答える
90

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

私がしていることは、ハドソン/ジェンキンスにすべてのビルドに対して次のことをさせることです:

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 ファイルに依存しないようにします)。私はそのようなツールを低級言語である Bash で作成しました。スクリプトはバージョン プラグインのようにバージョンを更新し、pom をソース管理に戻します。また、mvn バージョンのプラグインよりも 100 倍高速に実行されます。残念ながら、これは一般向けに書かれたものではありませんが、もし人々が興味を持っているなら、そのようにして Gist または github に入れることができます。

いくつかのコメントで、これが私たちの仕事であると尋ねられたため、ワークフローに戻ります。

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

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

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

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

于 2012-01-09T21:21:59.943 に答える
42

依存関係の構文は、依存関係バージョン要件仕様のドキュメントにあります。完全を期すために以下に示します。

依存関係の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>

于 2015-07-22T16:21:29.223 に答える
16

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

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

しかし、あなたは何か他のことを達成しようとしているのかもしれません;)

于 2008-08-27T16:30:04.833 に答える
10

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

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories
于 2015-08-03T08:38:56.173 に答える
7

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

于 2015-04-03T16:00:29.753 に答える