1. 概要

このチュートリアルでは、ローカルのMavenリポジトリが破損したときに強制的に更新する方法を学習します。 これを実現するために、簡単な例を使用して、リポジトリが破損する理由とその修正方法を理解します。

2. 前提条件

このチュートリアルのコマンドを学習して実行するには、 Spring Initializr プロジェクトを使用し、JDKとMavenをインストールする必要があります。

3. Mavenリポジトリ構造

Mavenは、プロジェクトのすべての依存関係を.m2フォルダーに保存します。 たとえば、次の画像では、Mavenリポジトリの構造を観察できます。

ご覧のとおり、Mavenはrepositoryフォルダーの下にあるすべての依存関係をダウンロードします。 したがって、実行時に必要なすべてのコードにアクセスするには、ローカルリポジトリにダウンロードする必要があります。

4. 依存関係をダウンロードしています

Mavenはpom.xmlファイル構成に基づいて機能することがわかっています。 Mavenがこのpom.xmlファイルを実行すると、依存関係が中央のMavenリポジトリからダウンロードされ、ローカルのMavenリポジトリに配置されます。 ローカルリポジトリにすでに依存関係がある場合、Mavenはそれらをダウンロードしません。

次のコマンドを実行すると、ダウンロードが発生します。

mvn package
mvn install

上記の両方に、次のコマンドの実行が含まれます。

mvn dependency:resolve 

したがって、dependentency:resolve コマンドを実行するだけで、パッケージを使用したりインストールしたりせずに、依存関係を解決することができます。

5. 破損した依存関係

依存関係のダウンロード中にネットワークグリッチが発生し、依存関係が破損する可能性があります。 中断された依存関係のダウンロードは、破損の主な原因です。 Mavenはそれに応じてメッセージを表示します:

Could not resolve dependencies for project ...

次に、この問題を解決する方法を見てみましょう。

6. 破損した依存関係を自動的に修正する

Mavenは通常、ビルドが失敗したことを通知すると、破損した依存関係を表示します。

Could not transfer artifact [artifact-name-here] ...

これを修正するために、自動または手動のアプローチを使用できます。 さらに、リポジトリの更新をデバッグモードで実行し、-Uの後に-Xオプションを追加して、更新中に何が発生するかをより正確に把握する必要があります。

6.1. すべてのSNAPSHOT依存関係を強制的に更新します

すでに知っているように、Mavenは既存の依存関係を再度ダウンロードすることはありません。 したがって、Mavenに破損したすべてのSNAPSHOT依存関係を強制的に更新するには、コマンドに -U / –update-snapshotsオプションを追加する必要があります。

mvn package -U
mvn install -U

それでも、オプションは Mavenがすでにスナップショットをダウンロードしていて、チェックサムが同じである場合、スナップショットの依存関係を再ダウンロードしません。

これにより、次にプロジェクトがパッケージ化またはインストールされます。 最後に、現在作業中のプロジェクトを含めずにリポジトリを更新する方法を学習します。

6.2. 依存関係解決の目標

パッケージまたはインストールコマンドを使用せずに、依存関係を解決してスナップショットを更新するようにMavenに指示できます。 この目的のために、 -U オプションを含めることにより、dependentency:resolveゴールを使用します。

mvn dependency:resolve -U

6.3. ローカルリポジトリの目標を削除する

-U は、破損したSNAPSHOT依存関係を再ダウンロードするだけです。 その結果、ローカルリリースの依存関係が破損している場合は、より深いコマンドが必要になる可能性があります。 この目的のために、以下を使用する必要があります。

mvn dependency:purge-local-repository

dependent:purge-local-repository の目的は、ローカルのMavenリポジトリーからアーティファクトをパージ(削除し、オプションで再解決)することです。 デフォルトでは、アーティファクトは再解決されます。

6.4. ローカルリポジトリオプションの削除

resolutionFuzzinessオプションに「groupId」を指定し、groupIdを指定して[ X222X] include オプション:

mvn dependency:purge-local-repository -Dinclude:org.slf4j -DresolutionFuzziness=groupId -Dverbose

resolutionFuzziness オプションには、 version ArtifactId groupId fileの値を指定できます。

上記の例では、org.slf4jグループ内のすべてのアーティファクトを検索してパージします。 また、 verbose オプションを設定して、削除されたアーティファクトの詳細なログを確認できるようにしました。

条件に一致するファイルが見つかった場合、ログには次のようなテキストが表示されます。

Deleting 2 transitive dependencies for project [...] with artifact groupId resolution fuzziness
[INFO] Purging artifact: org.slf4j:jul-to-slf4j:jar:1.7.31
Purging artifact: org.slf4j:slf4j-api:jar:1.7.31 

削除または更新のために含まれる、または除外されるアーティファクトを指定するには、オプションinclude/excludeを使用できることに注意してください。

mvn dependency:purge-local-repository -Dinclude=com.yyy.projectA:projectB -Dexclude=com.yyy.projectA:projectC

7. リポジトリを手動で削除する

-Uオプションとpurge-local-repositoryは、すべてを更新せずに破損した依存関係を解決する可能性がありますが、。m2ローカルリポジトリを手動で削除するとすべての依存関係の強制的な再ダウンロードを引き起こします。

これは、古い依存関係や破損している可能性のある依存関係がある場合に役立ちます。 次に、単純な再パッケージ化または再インストールで作業を行う必要があります。 さらに、dependentency:resolve オプションを使用して、プロジェクトの依存関係のみを解決できます。

8. 結論

このチュートリアルでは、ローカルリポジトリを強制的に更新するMavenのオプションと目標について説明しました。

使用されるサンプルは、適切なpom.xmlが構成されている任意のプロジェクトで使用できる単純なMavenコマンドです。