Mavenがローカルアーティファクトを見つけられない 質問する

Mavenがローカルアーティファクトを見つけられない 質問する

mvn -o package文句を言うので走れないようです

リポジトリ システムはオフラインですが、アーティファクト com.liferay.portal:util-bridges:jar:6.1.20 はローカル リポジトリで利用できません。

しかし、ローカル リポジトリを確認すると、そのアーティファクトはそこに存在します。settings.xml ファイルで updatePolicy を never に設定するという解決策も試しましたが、うまくいきませんでした。

ベストアンサー1

Maven 3.0.x より前のバージョンでは、Maven はローカル リポジトリ内のファイルの起源を追跡していませんでした。

これはビルドの問題を引き起こす可能性があります。特に、(現在は使用されていない)非常に壊れた java.net2 リポジトリをリストしたものをビルドしていた場合です... そのリポジトリはリリースされたアーティファクトを変更しただけでなく(非常に悪い、邪悪な慣行)、中央のアーティファクトと同じ座標で、異なるコンテンツを持つアーティファクトも公開しました(信じられないほど邪悪です)。

つまり、ビルドは機能するはずです (central から commons-io:commons-io:2.0 を取得しているため)。ローカル リポジトリを消去すると、ビルドは失敗します (java.net2 から commons-io:commons-io:2.0 を取得するため、これは pom 内の依存関係が異なる完全に異なる成果物です)。または逆に。

上記の状況は、Mavenリポジトリマネージャを使用する理由の1つです。これは、下流に公開するリポジトリのサブセットと、複数のリポジトリから成果物が解決される順序(通常はルーティングルールと呼ばれます)を制御できるためです。

いずれにせよ、Maven がリポジトリ アクセス レイヤーとして Aether に切り替えたときに、成果物がどこから来たのかを追跡し始めることが決定されました。

したがって、Maven 3.0.x では、アーティファクトがリポジトリからダウンロードされると、Maven は_maven.repositoriesファイルが解決された場所を記録するファイルを残します。プロジェクトをビルドしていて、リポジトリの有効なリストにアーティファクトが解決された場所が含まれていない場合、Maven はアーティファクトがキャッシュになかったと判断し、アーティファクトを再度解決しようとします...

ただし、3.0.x には多くのバグがあります... 最も重要なのは、offlineその処理方法です... つまり、オフラインの場合、Maven 3.0.x はリポジトリが存在しないと認識するため、常にファイルとの不一致が検出されます_maven.repositories!!!

Maven 3.0.xの回避策は、これらのファイルをローカルキャッシュから削除することです。例:

$ find ~/.m2/repository -name _maven.repositories -exec rm -v {} \;

副作用として、Maven 3.0.x が提供しようとしている保護が失われます。

良いニュースとしては、Maven 3.1 には必要な修正が含まれているということです (私たちがなんとかしてリリースできればの話ですが)

Maven 3.1では、オフラインモードでは_maven.repositoriesファイルは(半)無視され、オンラインビルドではそのファイルを無視するオプションもあります(レガシーモードと呼ばれます)。

現時点では(2013年6月1日)、法的要件とテスト要件を満たすリリースを作成するための4回目の試みが進行中です...したがって、4回目が幸運であると仮定すると、私は希望3.1.0-alpha-1 が 3 ~ 4 日後にリリースされる予定です... ただし、3.1 の変更が十分に浸透して、使用中のビルドが壊れないようにしたいため、もっと時間がかかる可能性があります (公開された API に変更がありました (偶然ですが、API はサイトと依存関係プラグインで必要です)。プラグインの作者はそれに依存していました (依存すべきではなかったのですが)。そのため、可能性はありますが、すべての基礎をカバーしていると思います)。

これであなたの質問への回答になったと思います (そして、おそらくあなたが知らなかった他のいくつかの質問にも答えられたと思います ;-) )

おすすめ記事