1概要

Mavenの依存関係を手動でアップグレードすることは、特に多くのライブラリが頻繁にリリースされるプロジェクトでは、常に面倒な作業です。

このチュートリアルでは、Versions Mavenプラグインを利用して依存関係を最新に保つ方法を学習します。

とりわけ、これは、依存関係を自動的にアップグレードし、それでもすべて正常に機能することをテストし、結果をコミットまたはロールバックするどちらか適切な方法で、Continuous Integrationパイプラインを実装するときに非常に役立ちます。


2 Mavenのバージョン範囲の構文

Maven 2の頃には、開発者は手作業による介入なしに成果物がアップグレードされるバージョンの範囲を指定することができました。

この構文はまだ有効で、いくつかのプロジェクトで使用されているので知っておく価値があります。

それにもかかわらず、可能であればVersions Mavenプラグインを支持してそれを避けるべきです。外部から具体的なバージョンを進めることで、Mavenが自分自身で全体の操作を処理するよりも確実に制御できるようになるからです。


2.1. 非推奨の構文

Maven2は結果を達成するために2つの特別なメタバージョン値も提供しました:

LATEST



RELEASE

  • ただし、この従来のアップグレード方法では、CIに再現性が必要な場合に予測不可能性が発生していました。 Maven 3では、これらは非推奨となり、完全に削除されました。

再現可能なビルドのために、Maven 3.xはPOMでこれらのメタバージョンの使用をサポートしなくなりました


3バージョンMavenプラグイン


Versions Maven Plugin

は、今日のバージョン管理を処理するための事実上の標準的な方法です。

リモートリポジトリ間の高レベルの比較からSNAPSHOTバージョンの低レベルのタイムスタンプロックまで、膨大な数の目標のリストにより、依存関係に関連するプロジェクトのあらゆる面に対処できます。

それらの多くはこのチュートリアルの範囲外ですが、アップグレードプロセスに役立つものを詳しく見てみましょう。


3.1. テストケース

始める前に、テストケースを定義しましょう。

  • ハードコードされたバージョンの3つのRELEASE

  • プロパティバージョンを含む1つのRELEASE

  • 1つの要約

<dependencies>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>4.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-compress</artifactId>
        <version>${commons-compress-version}</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.1-SNAPSHOT</version>
    </dependency>
</dependencies>

<properties>
    <commons-compress-version>1.15</commons-compress-version>
</properties>

最後に、プラグインを定義するときにプロセスからアーティファクトも除外しましょう。

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.7</version>
            <configuration>
                <excludes>
                    <exclude>org.apache.commons:commons-collections4</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>


4利用可能なアップデートの表示

まず第一に、

プロジェクトを更新できるかどうか、またその更新方法を簡単に知るための正しいツールはhttp://www.mojohaus.org/versions-maven-plugin/display-dependency-updates-mojo.html[

versions:display-dependency-updates

]

:

mvn versions:display-dependency-updates

ご覧のとおり、このプロセスにはすべてのRELEASEバージョンが含まれています。設定から除外されるのは更新プロセスであり、検出プロセスではないため、

commons-collections4

も含まれていました。

それとは対照的に、SNAPSHOTは無視されました。なぜなら、それは自動的に更新するのが安全ではないことが多い開発バージョンだからです。


5依存関係を更新する

初めてアップデートを実行すると、プラグインは

pom.xml.versionsBackup

という名前の

pom.xml

のバックアップを作成します。

すべての反復処理で

pom.xml

が変更されますが、ユーザーが(

mvnバージョン:commit

を使用して)コミットするまで、またはプロセス全体を元に戻す(

mvnバージョン:revert

を使用する)まで、バックアップファイルはプロジェクトの元の状態を保持します。


5.1. SNAPSHOTからRELEASEへの変換

プロジェクトにSNAPSHOT(まだ開発中のバージョン)が含まれていることがあります。



versions:use-releases


を使用して、通信相手のRELEASEが公開されているかどうかを確認し、さらにSNAPSHOTを変換することができます。同時にそのRELEASEに:

mvn versions:use-releases


5.2. 次のリリースへの更新

  • SNAPSHOT以外の依存関係はすべてhttp://www.mojohaus.org/versions-maven-plugin/use-next-releases-mojo.html[

    versions:use-next-releases

    ]を使用して、その最も近いバージョンに移植することができます。

mvn versions:use-next-releases

プラグインが

commons-io



commons-lang3

、さらには

commons-beanutils

を更新したことがはっきりとわかります。

  • 最も重要なこととして、プラグイン設定で除外されている

    commons-collections4

    と、プロパティを通じて動的に指定されるバージョン番号を持つ

    commons-compress

    を無視していました。


5.3. 最新のリリースへのアップデート

SNAPSHOT以外のすべての依存関係を最新リリースに更新する方法も同じです。目標をhttp://www.mojohaus.org/versions-maven-plugin/use-latest-releases-mojo.html[

versions:useに変更するだけです-latest-release

]:

mvn versions:use-latest-releases


6. 不要なバージョンを除外する

  • 特定のバージョンを無視したい場合は、外部ファイルから動的にルールをロードするためにhttp://www.mojohaus.org/versions-maven-plugin/version-rules.html#Ignoring

    certain

    versions[プラグイン設定を調整することができます]:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>2.7</version>
    <configuration>
        <rulesUri>http://www.mycompany.com/maven-version-rules.xml</rulesUri>
    </configuration>
</plugin>

最も注目に値する、

<rulesUri>

はローカルファイルも参照できます。

<rulesUri>file:///home/andrea/maven-version-rules.xml</rulesUri>


6.1. バージョンをグローバルに無視する

  • 特定の正規表現に一致するバージョンを無視するようにルールファイルを設定できます。

<ruleset comparisonMethod="maven"
  xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0
  http://mojo.codehaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
    <ignoreVersions>
        <ignoreVersion type="regex">.** -beta</ignoreVersion>
    </ignoreVersions>
</ruleset>


6.2. ルールごとにバージョンを無視する

最後に、ニーズがより具体的な場合は、代わりに一連のルールを構築できます。

<ruleset comparisonMethod="maven"
  xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0
    http://mojo.codehaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
    <rules>
        <rule groupId="com.mycompany.maven" comparisonMethod="maven">
            <ignoreVersions>
                <ignoreVersion type="regex">.** -RELEASE</ignoreVersion>
                <ignoreVersion>2.1.0</ignoreVersion>
            </ignoreVersions>
        </rule>
    </rules>
</ruleset>


7. 結論

安全で自動的なMaven3準拠の方法でプロジェクトの依存関係を確認および更新する方法を見てきました。

いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/maven/versions-maven-plugin[GitHubに追加]と、すべてを段階的に紹介するためのスクリプトと一緒に入手できます。そして複雑さなしで。

実際の動作を確認するには、単にプロジェクトをダウンロードして端末(またはWindowsを使用している場合はGit Bash)で実行します。

./run-the-demo.sh