为啥 Maven 每次都下载 maven-metadata.xml?

Posted

技术标签:

【中文标题】为啥 Maven 每次都下载 maven-metadata.xml?【英文标题】:Why is Maven downloading the maven-metadata.xml every time?为什么 Maven 每次都下载 maven-metadata.xml? 【发布时间】:2013-05-01 13:10:23 【问题描述】:

以下是我在尝试使用 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)

【问题讨论】:

在 SNAPSHOT 的情况下访问元数据是必要的,以便让 Maven 了解新创建的 SNAPSHOT 等。 我不知道为什么,但是您可以通过使用 -o 选项来避免这种情况,例如 mvn clean install -o 实际上,构建失败的错误是“Error assemble WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if execution in update mode)”。所以你应该解决这个问题。我无法想象它与您的互联网连接有关。依赖解决警告就是:警告。它们不是构建失败的最终原因。 也许您可以澄清您的问题,因为您似乎有两个问题:1)为什么我的构建失败了? 2)为什么 Maven 试图下载元数据? user944849 的回答对回答 2) 有很大帮助。如果这回答了你的问题,你应该接受它。 使用-nsu--no-snapshot-updates选项和mvn可以避免快照元数据更新 【参考方案1】:

就我而言,我使用私有存储库管理器。虽然不推荐使用其他一些 Maven 存储库管理器。看起来 gradle 从已弃用的存储库管理器中查找我的私有工件。更新或删除已弃用的存储库管理器为我解决了这个问题。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

像这样:

maven compile -o

【讨论】:

我相信这应该是正确的答案,因为当您的互联网连接不稳定时,您可以简单地调用此命令。这就是被问到的......【参考方案4】:

在您的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>

注意&lt;updatePolicy&gt; 元素。该示例告诉 Maven 在构建过程中任何时候 Maven 需要检索快照工件时联系远程存储库(在我的情况下为 Nexus,如果您不使用自己的远程存储库,则为 Maven 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 会在“离线”模式下运行。它知道它只有一个本地存储库,并且无论您使用什么更新策略,它都不会联系远程存储库来刷新工件。

【讨论】:

问题是:为什么它并不总是“从不”(我认为它应该是)?为什么需要每天或总是更新? @Leon 在开发中期,您的项目可能具有“-SNAPSHOT”依赖项,您可能希望始终为其选择最新构建的版本——至少,在 CI 系统上,您可能会,开发人员可能有不同的偏好 - 交易构建稳定性与获取最新更改。如果未设置任何内容,Maven 文档(不幸的是,典型地)未能明确的是这些的默认值。 最佳实践是工件一旦发布就永远不会改变,所以 never 应该适合他们。 但是如果您将 POM 依赖项更新到新版本会怎样?永远不会更新吗? @PhilipRego - updatePolicy 适用于每个工件。如果您更改版本号或组/工件 ID,那就是不同的工件。如果 updatePolicy 为“从不”,则工件将被下载一次,除非使用 -U 强制刷新或工件已从本地存储库中删除,因此需要重新下载。【参考方案5】:

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

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

【讨论】:

那么如何指定插件版本呢?我确定我在 POM 中设置了版本...你能更具体吗? 好吧,如果你在plugin 元素中有一个version 元素,那么你确实已经配置了它,如果是这样,我没有想法......祝你好运 在我的情况下,版本是一个范围 [12.1 12.2) 并且元数据缓存设置为 24 小时,因此它会在每天第一次构建时检查更新的版本 默认插件怎么样?比如maven-surefire-common,我没有指定? 他们的版本对于给定的 maven 版本是固定的,但您可以使用 pluginManagement 部分强制使用不同的版本【参考方案6】:

我还没有研究过,当 Maven 进行哪个查找时,但为了获得稳定且可重复的构建,我强烈建议不要直接访问 Maven 存储库,而是使用 Maven 存储库管理器,例如 Nexus。

这里是如何设置设置文件的教程:

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

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

【讨论】:

@acdcjunior 正如我所说,我还没有研究过。但是使用本地 Maven 存储库管理器也可以解决大部分问题(如果 Maven 检查元数据,它只会访问您的 Maven 存储库管理器) 恕我直言,repo 管理器仅在组织内部有用,以避免冗余下载,特别是部署特定于该组织的工件(如父 pom 和内部模块)。否则为什么要添加一个额外的镜像,因为你已经有了本地镜像? @Puce 我不明白这将如何解决问题。如果您根本不希望 maven 通过网络检查元数据,那么它是从 Internet 还是从 Intranet repo 管理器检查都没有关系。 @eis 如果“互联网连接不稳定”或其中一个存储库服务器当前不可用,它应该会有所帮助,因为您只访问局域网中的 maven 存储库管理器。 @Gap 虽然由于您提到的原因,回购管理器在组织中特别有用,但回购管理器对于获得稳定和可重复的构建也很重要,这是我通常的目标,即使我是目前是该项目的唯一开发商。它确保我可以擦除我的本地存储库并且仍然能够重现所有构建,并且其他开发人员可以轻松地加入该项目。我向 Jenkins 保证这一点,它有时也在本地运行,也可以访问 repo 管理器,还有助于发布我的项目 -> 2 个用户访问 repo 管理器:Jenkins 和我自己

以上是关于为啥 Maven 每次都下载 maven-metadata.xml?的主要内容,如果未能解决你的问题,请参考以下文章

Android错误:Download maven-metadata.xml..每次运行都重新下载

我的电脑是win7的,为啥下载不了NET Framework 4.0,每次都失败

我用eclipse弄了个maven,然后每次修改jdk的时候都会在java resources上有个红叉

tomcat 每次启动编译文件classes 为啥还用ANT进行重新编译? 和maven有啥区别

64位win7为啥每次打开xscan都提示丢失NPPTools.dll

为啥执行maven命令时,会首先链接远程仓库呢