Mavenが毎回maven-metadata.xmlをダウンロードするのはなぜですか?


116

以下は、MavenでWebアプリケーションを構築しようとしたときにインターネット接続が不安定な場合に通常発生するエラーです。

私の質問は、同じアプリが以前にビルドされている場合、なぜMavenは常にダウンロードする必要があるのか​​ということです。

Mavenを毎回ダウンロードさせる私の設定の何が問題になっているのでしょうか?

以下は、オフラインでビルドしようとすると表示されるエラーです。

[INFO] ------------------------------------------------------------------------
[INFO] Building mywebapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://raw.github.com/pagecrumb/mungo/mvn-repo/com/pagecrumb/mungo/0.0.1-SNAPSHOT/maven-metadata.xml

[WARNING] Could not transfer metadata com.mywebapp:mungo:0.0.1-SNAPSHOT/maven-metadata.xml 
from/to mungo-mvn-repo (https://raw.github.com/pagecrumb/mungo/mvn-repo/): raw.github.com
[INFO] 
[INFO] --- maven-war-plugin:2.1.1:war (default-cli) @ mywebapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [mywebapp] in [D:\workspace\web\target\mywebapp-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\workspace\web\src\main\webapp]
[INFO] Webapp assembled in [1237 msecs]
[INFO] Building war: D:\workspace\web\target\mywebapp-1.0-SNAPSHOT.war
[WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored 
(webxml attribute is missing from war task, 
or ignoreWebxml attribute is specified as 'true')
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building com.mywebapp [com.mywebapp] 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/2.1/maven-release-plugin-2.1.pom

[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-release-plugin:2.1: Plugin org.apache.maven.plugins:maven-release-plugin:2.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-release-plugin:jar:2.1
Downloading: http://download.java.net/maven/2/org/apache/maven/plugins/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/codehaus/mojo/maven-metadata.xml

397/397 B   

Downloaded: http://download.java.net/maven/2/org/codehaus/mojo/maven-metadata.xml (397 B at 0.0 KB/sec)
[WARNING] Failure to transfer org.apache.maven.plugins:maven-war-plugin/maven-metadata.xml from http://download.java.net/maven/2 was cached in the local repository, resolution will not be reattempted until the update interval of maven2-repository.dev.java.net has elapsed or updates are forced. Original error: Could not transfer metadata org.apache.maven.plugins:maven-war-plugin/maven-metadata.xml from/to maven2-repository.dev.java.net (http://download.java.net/maven/2): download.java.net
[INFO] 
[INFO] --- maven-war-plugin:2.3:war (default-cli) @ mywebapp-build ---
[INFO] Packaging webapp
[INFO] Assembling webapp [mywebapp-build] in [D:\workspace\target\mywebapp-build-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [15 msecs]
[INFO] Building war: D:\workspace\target\mywebapp-build-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] mywebapp ..................................... SUCCESS [27.999s]
[INFO] com.mywebapp [com.mywebapp] ..................... FAILURE [1:00.406s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:41.409s
[INFO] Finished at: Tue May 07 22:13:38 SGT 2013
[INFO] Final Memory: 11M/28M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.3:war 
(default-cli) on project mywebapp-build: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)

2
新しく作成された
スナップショット

7
理由はわかりませんが、-oオプションを使用することで回避できますmvn clean install -o
ant

実際、ビルドが失敗するエラーは、「WARのアセンブルエラー:webxml属性が必要です(または更新モードで実行する場合は、既存のWEB-INF / web.xml)」です。だからあなたはそれを修正するべきです。インターネット接続に関連しているとは想像できません。依存関係の解決に関する警告は、警告のみです。これらはビルド失敗の最終的な原因ではありません。
フランス

おそらく2つの質問があるように見えるので、質問を明確にすることができます。1)ビルドが失敗するのはなぜですか?2)Mavenがメタデータをダウンロードしようとするのはなぜですか?user944849の回答は、2)の回答に非常に役立ちます。それがあなたの質問に答えるなら、あなたはそれを受け入れるべきです。
フランス、

スナップショットメタデータの更新は-nsu--no-snapshot-updatesオプションを使用して回避できますmvn
Janaka Bandara '26

回答:


127

探す場所あなたsettings.xml(または、おそらくあなたのプロジェクトの親や企業の親POM)のための<repositories>要素。以下のようになります。

<repositories>
    <repository>
        <id>central</id>
        <url>http://gotoNexus</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </releases>
    </repository>
</repositories>

<updatePolicy>要素に注意してください。この例では、Mavenがビルド中にスナップショットアーティファクトを取得する必要があるときはいつでも、リモートリポジトリ(私の場合はNexus、独自のリモートリポジトリを使用していない場合はMaven Central)に連絡し、新しいコピーがあるかどうかを確認するようMavenに指示しています。これにはメタデータが必要です。新しいコピーがある場合、Mavenはそれをローカルリポジトリにダウンロードします。

この例では、リリースの場合、ポリシーはdailyその日の最初のビルド時にチェックするようになっています。 Maven設定ドキュメントでnever説明されているように、これも有効なオプションです。

プラグインは個別に解決されます。必要に応じて、異なる更新ポリシーを使用して、それらのリポジトリを構成することもできます。

<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <url>http://gotoNexus</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
        </releases>
    </pluginRepository>
</pluginRepositories>

他の誰かが-oオプションについて言及しました。これを使用すると、Mavenは「オフライン」モードで実行されます。ローカルリポジトリのみであることを認識しており、使用する更新ポリシーに関係なく、リモートリポジトリに接続してアーティファクトを更新しません。


2
問題は、なぜそれが常に「絶対に」行われないのか(そうあるべきだと私は思う)なのでしょうか。なぜ毎日または常に更新する必要があるのですか?
レオン

@Leon開発中のサイクルの間、プロジェクトには '-SNAPSHOT'依存関係があり、常に最新のビルドバージョンを選択する必要があります-少なくとも、CIシステムではおそらく、開発者は好みが異なる可能性があります-トレーディングビルドの安定性最新の変更を取得するか。何も設定されていない場合のMavenのドキュメント(特徴として、残念ながら)が明らかにできないのは、これらのデフォルト値です。
Ed Randall 2017

1
ベストプラクティスは、リリースされたアーティファクトは決して変更されないため、<updatePolicy> never </ updatePolicy>はそれらに適している必要があります。
Ed Randall 2017

しかし、POMの依存関係を新しいリリースに更新するとどうなるでしょうか。更新されることはありませんか?
Philip Rego

1
@PhilipRego-updatePolicyはアーティファクトごとに適用されます。バージョン番号またはグループ/アーティファクトIDを変更すると、それは別のアーティファクトになります。updatePolicyが「never」の場合、更新が強制される-Uか、アーティファクトがローカルリポジトリから削除されて再ダウンロードが必要にならない限り、アーティファクトは1回ダウンロードされます。
user944849

31

それ-o,--offline "Work offline"を防ぐためにフラグを使用する可能性があります。

このような:

maven compile -o


インターネット接続が不安定なときにこのコマンドを呼び出すだけでよいので、これが正しい答えであると思います。そして、これは尋ねられたものでした...
だからS

13

プラグインのバージョンを指定しなかったので、最後のメタデータを取得するために関連するメタデータのダウンロードをトリガーしたと思います。

それ以外の場合、-oを使用してローカルリポジトリの使用を強制しようとしましたか?


それでは、プラグインのバージョンをどのように指定しますか?POMにバージョンが設定されているはずです...より具体的にできますか?
クォーク2013年

あなたが持っているだけでなく場合はversion内部要素pluginの要素をそのアイデアを出しi'am場合...幸運、あなたは確かに、それを構成した

私の場合、バージョンは範囲[12.1 12.2)であり、メタデータキャッシュは24時間に設定されていたため、毎日最初のビルド時に新しいバージョンをチェックしていました
mzzzzb

デフォルトのプラグインはどうですか?などmaven-surefire-common、私は指定していませんか?
yegeniy 2018年

それらのバージョンは特定のmavenリリース用に修正されていますが、pluginManagementセクションを使用して別のバージョンを強制することができます
Gab

0

私はまだ勉強していませんが、Mavenがどのルックアップを行うかはわかりませんが、安定して再現可能なビルドを取得するには、Mavenリポジトリに直接アクセスするのではなく、NexusなどのMavenリポジトリマネージャーを使用することを強くお勧めします。

これは、設定ファイルを設定する方法のチュートリアルです。

http://books.sonatype.com/nexus-book/reference/maven-sect-single-group.html

http://maven.apache.org/repository-management.html


@acdcjunior私が言ったように、私はまだそれを研究していません。ただし、ローカルのMavenリポジトリマネージャーを使用すると、これらの問題のほとんども解決されます(Mavenがメタデータをチェックする場合、Mavenリポジトリマネージャーにのみアクセスします)
Puce

1
IMPOリポマネージャーは、冗長なダウンロードを回避し、特にこの組織に固有のアーティファクト(親pomや内部モジュールなど)を展開するために組織内でのみ役立ちます。それ以外の場合は、ローカルのミラーがすでにあるので、なぜ追加のミラーを追加するのですか
ギャブ2013年

@Puceそれが問題をどのように解決するかわかりません。Mavenがネットワーク全体でメタデータをチェックしないようにする場合は、インターネットからチェックするか、イントラネットレポマネージャーからチェックするかは関係ありません。
e's

@eisは、「インターネット接続が不安定」である場合、またはLAN内のMavenリポジトリマネージャーにのみアクセスしているため、リポジトリサーバーの1つが現在利用できない場合に役立つはずです。
Puce

@Gapリポマネージャーは、あなたが言及した理由のために組織で特に有用ですが、リポマネージャーは、安定して再現可能なビルドを取得することも重要です。これは、私が現在プロジェクトの唯一の開発者である場合でも、私が通常目指していることです。これにより、ローカルリポジトリをワイプしてもすべてのビルドを再現でき、他の開発者がプロ​​ジェクトに簡単に参加できることが保証されます。私は時々もローカルに実行ジェンキンス、とこれを保証する、だけでなく、レポマネージャにアクセスしても、私のプロジェクトを解放するのに役立ちます- >レポマネージャーにアクセスする2つのユーザー:ジェンキンスと私
ピュース

0

Mavenがこれを行うのは、依存関係がSNAPSHOTバージョンにあり、Mavenがリポジトリ内のそのスナップショットバージョンに加えられた変更を検出する方法がないためです。アーティファクトを解放し、pom.xmlのバージョンをそのバージョンに変更すると、mavenはメタデータファイルをフェッチしなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.