Почему Maven загружает maven-metadata.xml каждый раз?

Ниже приведена ошибка, которую я обычно получаю, когда мое интернет-соединение ненадежное при попытке создать веб-приложение с помощью maven.

Мой вопрос заключается в том, почему 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)

6 ответов

Решение

Посмотри в свой 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 так он проверит во время вашей первой сборки за день. never также является допустимым параметром, как описано в документации по настройкам Maven.

Плагины разрешаются отдельно. Для них также могут быть настроены репозитории с различными политиками обновления, если это необходимо.

<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 работает в автономном режиме. Он знает, что имеет только локальное репо, и не будет связываться с удаленным репо, чтобы обновить артефакты, независимо от того, какие политики обновления вы используете.

Возможно использовать флаг -o,--offline "Work offline" чтобы предотвратить это.

Как это:

maven compile -o

Я полагаю, потому что вы не указали версию плагина, поэтому он запускает загрузку связанных метаданных, чтобы получить последнюю.

В противном случае вы пытались принудительно использовать локальное репо с помощью -o?

Maven делает это, потому что ваша зависимость находится в версии SNAPSHOT, и maven не имеет возможности обнаружить какие-либо изменения, внесенные в эту версию моментального снимка в репозитории. Освободите свой артефакт и измените версию в pom.xml на эту версию, и maven больше не будет получать файл метаданных.

Я еще не изучал, когда Maven делает какой поиск, но чтобы получить стабильные и воспроизводимые сборки, я настоятельно рекомендую не обращаться к Maven Respositories напрямую, а использовать менеджер репозитория Maven, такой как Nexus.

Вот учебник, как настроить файл настроек:

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

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

В моем случае я использую менеджер частного репозитория. В то время как некоторые другие средства управления репозиториями maven устарели. Похоже, что gradle ищет мои частные артефакты из устаревших менеджеров репозиториев. Обновление или удаление устаревших менеджеров репозиториев решает проблему для меня.

Другие вопросы по тегам