web-dev-qa-db-ja.com

Mavenリポジトリから古い依存関係をきれいにする方法は?

ダウンロードした依存関係をMavenが保存する.m2フォルダーにファイルが多すぎます。古い依存関係をすべて削除する方法はありますか?たとえば、3つの異なるバージョン(1、2、および3)に依存関係がある場合、クリーニング後は3番目のみである必要があります。 .m2フォルダー内のすべての依存関係に対してどのように行うことができますか?

53
Cherry

Unixを使用している場合は、そこにあるファイルのアクセス時間を使用できます。ファイルシステムのアクセス時間を有効にし、依存関係を保持するすべてのプロジェクトのクリーンビルドを実行してから、次のような操作を行います(未テスト!)。

find ~/.m2 -amin +5 -iname '*.pom' | while read pom; do parent=`dirname "$pom"`; rm -Rf "$parent"; done

これにより、5分以上前に最後にアクセスされたすべての* .pomファイルが検出され(ビルドを最大5分前に開始したと仮定)、それらのディレクトリが削除されます。

Rmの前に「echo」を追加して、「ドライラン」を実行します。

29
Florian

短い答え-{user.home}の.m2フォルダーを削除しました。例えば。 Windows 10では、ユーザーのホームはC:\Users\user1です。 mvn clean packageを使用してプロジェクトを再構築します。プロジェクトに必要な依存関係のみが残ります。

ロングアンサー-.m2フォルダーは通常のフォルダーと同じで、フォルダーのコンテンツは異なるプロジェクトから作成されます。どのライブラリが「古い」かを自動的に判断する方法はないと思います。実際、古い言葉はあいまいな言葉です。ライブラリの以前のバージョンがプロジェクトで使用される場合、非常に多くの理由が考えられます。そのため、どれが未使用かを判断することはできません。

できることは、.m2フォルダーを削除して、すべてのプロジェクトを再ビルドすることです。そうすると、フォルダーはすべての必要なライブラリーで自動的にビルドされます。

すべてのプロジェクトで使用されるライブラリの特定のバージョンのみに関心がある場合。プロジェクトのPOMも最新バージョンに更新することが重要です。つまり、異なるPOMが異なるバージョンのライブラリを参照している場合、すべてが.m2でダウンロードされます。

24

MavenプロジェクトのPOMファイルを指定すると、 Apache Maven Dependency Plugin を使用して、ローカルリポジトリ(デフォルトでは〜/ .m2/respository)のすべての依存関係を削除できます。

ローカルリポジトリからプロジェクトの依存関係を削除し、オプションでそれらを再解決するdependency:purge-local-repository機能が含まれています。

ローカルの依存関係を削除するには、オプションのパラメータ reResolve を使用し、デフォルトでtrueに設定されているため、falseに設定するだけです。

このコマンドラインコールは動作するはずです:

mvn dependency:purge-local-repository -DreResolve=false
7
Juanjo Marron
  1. プロジェクトのすべての実際の依存関係をダウンロードします

    find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
    
  2. ローカルのMavenリポジトリを一時的な場所に移動します

    mv ~/.m2 ~/saved-m2
    
  3. 保存されたリポジトリのすべてのファイルの名前をmaven-metadata-central.xml *からmaven-metadata.xml *に変更します。

    find . -type f -name "maven-metadata-central.xml*" -exec rename -v -- 's/-central//' '{}' \;
    
  4. ローカルリポジトリの変更されたコピーをミラーとして設定するには、ディレクトリ〜/ .m2およびファイル〜/ .m2/settings.xmlを次の内容で作成します(を置き換えますuserユーザー名):

    <settings>
     <mirrors>
      <mirror>
       <id>mycentral</id>
       <name>My Central</name>
       <url>file:/home/user/saved-m2/</url>
       <mirrorOf>central</mirrorOf>
      </mirror>
     </mirrors>
    </settings>
    
  5. プロジェクトの依存関係を再度解決します。

    find your-projects-dir -name pom.xml -exec mvn -f '{}' dependency:resolve
    
  6. これで、必要なアーティファクトを最小限に抑えたローカルMavenリポジトリが作成されました。設定ファイルとファイルシステムからローカルミラーを削除します。

4
Sergey B.

Mavenリポジトリから古い依存関係も削除したかったのです。 Florianの答えを実行することを考えましたが、長いLinuxスニペットを覚えることなく何度も実行できるものが必要で、少し設定可能なものが必要でした-より多くのプログラム、より少ないUNIXコマンドのチェーン、そのため、基本的なアイデアを取り入れて、(比較的小さな)Rubyプログラムを作成しました。このプログラムは、最終アクセス時刻に基づいて古い依存関係を削除します。

「古いバージョン」は削除されませんが、実際には2つの異なるバージョンの依存関係を持つ2つの異なるアクティブなプロジェクトが存在する可能性があるため、とにかく望んでいたことはできませんでした。代わりに、Florianの答えのように、最近アクセスされていない依存関係を削除します。

試してみたい場合は、次のことができます。

  1. GitHubリポジトリ にアクセスします
  2. リポジトリを複製するか、ソースをダウンロードします
  3. 必要に応じて、コードを調べて、悪意がないことを確認します
  4. bin/mvncleanを実行します

デフォルトのMavenリポジトリをオーバーライドする、ファイルを無視する、しきい値の日付を設定するオプションがありますが、GitHubのREADMEでそれらを読むことができます。

Ruby gemとしてもう少し作業を行った後、おそらくパッケージ化します。Rubyが既にインストールされていて動作している場合は、問題(gem install mvnclean; mvnclean)を簡素化します。

1

.m2-> repositoryフォルダーの下にあるすべてのコンテンツを消去するだけです。プロジェクトをビルドすると、すべての依存関係がここにロードされます。

あなたのケースでは、以前のプロジェクトが古いバージョンの依存関係を使用していたため、バージョンがアップグレードされている可能性があります。

これで、最新バージョンのモジュールとの依存関係がこのフォルダーにダウンロードされます。

ローカルMavenリポジトリ内のライブラリの古いバージョンを削除するために、ユーティリティを思いついてGitHubでホストしました。ユーティリティは、デフォルトの実行で、アーティファクトのすべての古いバージョンを削除し、最新のもののみを残します。オプションで、すべてのスナップショット、ソース、javadocsを削除できます。また、このプロセスでグループまたはアーティファクトを強制/除外できます。このクロスプラットフォームは、最終アクセス/ダウンロードの日付に基づいた日付ベースの削除もサポートしています。

https://github.com/techpavan/mvn-repo-cleaner

1
Pavan Kumar

プロジェクトに必要な依存関係をコピーする必要があります。これらを手に入れて、プロジェクトのPOM.XMLファイルから<dependency>タグに埋め込まれたすべての<dependencies>タグをクリアしてください。

ファイルを保存した後、LibrariesMaven Dependenciesが表示されません。次に、以前にコピーした<dependency>を貼り付けてください。

必要なjarファイルはMavenによって自動的にダウンロードされます。ファイルを保存した後、生成されたMaven DependenciesLibrariesでも確認できます。

ありがとう。

0