为什么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
在快照的必要的情况下,元数据的访问获得的Maven了解新创建快照的等等
khmarbaise

7
我不知道为什么,但是您可以通过使用-o选项(例如mvn clean install -o
ant)

实际上,构建失败的错误是“错误组装WAR:需要webxml属性(如果在更新模式下执行,则是预先存在的WEB-INF / web.xml)”。因此,您应该解决该问题。我无法想象它与您的互联网连接有关。依赖关系解决方案警告仅是:警告。它们不是构建失败的最终原因。
弗朗斯2013年

似乎有两个问题,也许您可​​以澄清一下问题:1)为什么我的构建失败了?2)为什么Maven试图下载元数据?user944849的答案对回答2很有帮助。如果回答您的问题,您应该接受它。
弗朗斯

可以避免使用快照元数据更新-nsu--no-snapshot-updates选项mvn
Janaka Bandara

Answers:


127

在您settings.xml<repositories>元素(或项目的父级或公司父级POM)中查找该元素。它看起来像下面的样子。

<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每当Maven在构建期间需要检索快照工件时,就联系远程仓库(在本例中为Nexus,如果您不使用自己的远程仓库,则为Nexus Central),以检查是否有较新的副本。为此,需要元数据。如果有较新的副本,Maven会将其下载到本地存储库。

在示例中,对于版本,策略为 daily这样的,因此它将在一天的首次构建期间进行检查。 never也是有效的选项,如Maven settings docs中所述

插件单独解决。您可能还为它们配置了存储库,如果需要,可以使用不同的更新策略。

<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

1
最佳实践是,工件一旦发布就不会更改,因此<updatePolicy> Never </ updatePolicy>应该适合它们。
Ed Randall

但是,如果您将POM依赖项更新为新版本,该怎么办?永远不会更新吗?
菲利普·雷哥

1
@PhilipRego-updatePolicy适用于每个工件。如果您更改版本号或组/工件ID,则是不同的工件。如果updatePolicy为“从不”,则除非强制执行刷新-U或从本地存储库中删除了工件,然后需要重新下载,否则工件将被下载一次。
user944849

31

可能使用该标志-o,--offline "Work offline"来防止这种情况。

像这样:

maven compile -o


我相信这应该是正确的答案,因为您可以在互联网连接不畅时简单地调用此命令。这就是被问到的……
所以,S

13

我想是因为您没有指定插件版本,所以它触发了相关元数据的下载以获得最后一个。

否则,您是否尝试使用-o强制使用本地存储库?


那么如何指定插件版本?我确定我在POM中设置了版本...您能具体一点吗?
夸克

好吧,如果您在version元素中包含plugin元素,那么您确实已经配置了它,如果是这样,我就没主意了……祝您好运
-Gab

在我的情况下,该版本的范围为[12.1 12.2],并且元数据缓存设置为24小时,因此它将在每天的首次构建中检查更新的版本
mzzzzb 2014年

那么默认插件呢?例如maven-surefire-common,我尚未指定?
yegeniy

对于给定的Maven版本,其版本是固定的,但是您可以使用 pluginManagement部分
瞎扯

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 Repository Manager也可以解决大多数此类问题(如果Maven检查元数据,它将仅访问您的Maven Repository Manager)
Puce

1
恕我直言,回购管理器仅在组织内部有用,以避免冗余下载,尤其是部署特定于该组织的工件(例如父poms和内部模块)。否则,为什么要添加额外的镜像,因为您已经拥有本地镜像了?
加布

@Puce我看不到如何解决这个问题。如果您根本不想让Maven在整个网络上检查元数据,那么它是从Internet还是从Intranet回购管理器进行检查都没有关系。
EIS

@eis如果“ internet connection is flanky”或存储库服务器之一当前不可用,应该会有所帮助,因为您仅在LAN中访问maven存储库管理器。
佩斯

@Gap尽管回购管理器由于您提到的原因在组织中特别有用,但回购管理器对于获得稳定和可复制的构建也很重要,即使我目前是该项目的唯一开发人员,我通常也希望这样做。它确保了我可以擦除本地存储库,并且仍然能够复制所有构建,并且其他开发人员可以轻松加入该项目。我向Jenkins保证,有时也会在本地运行,也可以访问回购管理器,还可以帮助释放我的项目-> 2个访问回购管理器的用户:Jenkins和我本人
Puce,

0

Maven这样做是因为您的依赖项是SNAPSHOT版本,并且maven无法检测到存储库中对该快照版本进行的任何更改。释放工件,然后将pom.xml中的版本更改为该版本,并且maven将不再获取元数据文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.