web-dev-qa-db-ja.com

Mavenに特定のグループのアーティファクトの更新を確認する試みをmaven-central-repoから停止させるにはどうすればよいですか?

私はかなり大きなMavenプロジェクトに取り組んでいます。おそらく、約70ほどの個別のアーティファクトがあり、それらは共有コードの2つのライブラリと、それらを使用する10個のアプリケーションに大まかに分けられています。これらのアイテムはすべて名前空間com.mycompany.*に存在します。

ほとんどの場合、スナップショットビルドに対して実行しています。したがって、アプリケーションのフルビルドを行うには、最初にライブラリプロジェクトをビルドして、ローカルリポジトリ(たとえば、mycompany-libname-2.4-SNAPSHOT.jar)にインストールするようにします。

問題は、それからアプリケーションをビルドするときです。何らかの理由で、Mavenはすべてのmycompany-*-SNAPSHOT.jarアーティファクトの更新について、メインの2つのパブリックリポジトリ(maven-net-repoおよびJava-net-repo)を確認したいと考えています。もちろん、それらはそこに見つからず、最終的にすべてがローカルリポジトリにビルドしたばかりのバージョンに戻りますが、(a)悪いネットのように感じるので、Mavenにこれをやめてほしいです。 (b)ビルドプロセスに不必要で迷惑なネットワークレイテンシを追加するため、これらのリポジトリを常にチェックするため。

ほとんどの場合、これを回避するためにオフラインモードでmavenを実行しますが、それは理想的ではありません。公開ライブラリへの依存関係が時々更新されるからです。だから私が探しているのは、Mavenが特定の条件を満たすアーティファクトの特定のリポジトリからの更新をチェックしないようにするソリューションです-この場合、MavenがSNAPSHOTバージョンまたはcom.mycompany名前空間。

118
Tim Gilbert

UpdatePolicyタグは機能しませんでした。ただし、リッチセラーはスナップショットをとにかく無効にする必要があると述べたため、さらに調べて、settings.xmlに追加した追加のリポジトリが実際に問題を引き起こしていることに気付きました。 settings.xmlのこのリポジトリにスナップショットセクションを追加すると、うまくいきました!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>
31
Dennis Lassing

また、mvnコマンドラインで-oまたは--offlineを使用して、mavenを「オフラインモード」にして、更新をチェックしないようにすることもできます。ローカルリポジトリにない依存関係を取得できないという警告が表示されますが、大したことはありません。

157
Jeff Tsay

Mavenでも利用できるようになったものは

mvn goal --no-snapshot-updates

または要するに

mvn goal -nsu
87
joostschouten

更新:あなたのプロジェクトはスナップショットなので、おそらくこれから始めるべきだったでしょう。これは、Mavenが各ビルドで更新をチェックするSNAPSHOTセマンティクスの一部です。 SNAPSHOTであるということは、揮発性であり、変更される可能性があるため、更新を確認する必要があることを意味します。ただし、 Maven super POM は、スナップショットを無効にするようにcentralを構成するため、Mavenは、独自のpom/settingsでオーバーライドしない限り、centralでSNAPSHOTの更新を確認しないでください。


中央リポジトリに mirror を使用するようにMavenを設定できます。これにより、通常は中央リポジトリに送られるすべてのリクエストが内部リポジトリにリダイレクトされます。

Settings.xmlに次のようなものを追加して、内部リポジトリを中央のミラーとして設定します。

<mirrors>
  <mirror>
    <id>ibiblio.org</id>
    <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
    <url>http://path/to/my/repository</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

内部リポジトリに Nexus のようなリポジトリマネージャを使用している場合。プロキシセントラルに プロキシリポジトリ を設定できるため、通常セントラルに送信されるリクエストは代わりにプロキシリポジトリに送信されます(またはプロキシを含む リポジトリグループ 、以降のリクエストは内部リポジトリマネージャーにキャッシュされます。プロキシキャッシュタイムアウトを-1に設定することもできます。これにより、プロキシリポジトリに既にあるコンテンツをCentralから要求することはありません。


ローカルリポジトリのみで作業している場合のより基本的な解決策は、中央リポジトリのupdatePolicyを「never」に設定することです。これは、Mavenがまだローカルリポジトリにないアーティファクトを確認します。これは、必要に応じてコマンドラインで-Uスイッチを使用してMavenに強制的に更新を確認させることでオーバーライドできます。

次のように、リポジトリーを(pomまたはsettings.xmlのプロファイルで)構成します。

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>
32
Rich Seller

非常にシンプル:

Super POM親またはsetting.xmlで、使用します

        <repository>
        <id>central</id>
        <releases>
            <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
            <updatePolicy>never</updatePolicy>
        </snapshots>
        <url>http://repo1.maven.org/maven2</url>
        <layout>legacy</layout>
    </repository>

それは私のヒントです

4
Bruno Régnier

これに似たトラブルがありました

<repository>
    <id>Java.net</id>
    <url>https://maven-repository.dev.Java.net/nonav/repository</url>
    <layout>legacy</layout>
</repository>
<repository>
    <id>Java.net2</id>
    <url>https://maven2-repository.dev.Java.net/nonav/repository</url>
</repository>

UpdatePolicyを「never」に設定しても機能しませんでした。これらのレポを削除することは、私が解決した方法でした。 ps:私はこれをフォローしていました tutorial Webサービスについて(ところで、おそらくws for Javaの最良のチュートリアル)

0
thirdy