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