如何防止 Maven 为我的仓库中已有的工件下载 maven-metadata.xml?

Posted

技术标签:

【中文标题】如何防止 Maven 为我的仓库中已有的工件下载 maven-metadata.xml?【英文标题】:How do I prevent Maven from downloading maven-metadata.xml for an artifact that I already have in my repo? 【发布时间】:2014-12-20 18:15:35 【问题描述】:

我使用的是 Maven 3.2。我的 pom.xml 文件(一个 WAR 项目)中有这个依赖项

            <dependency>
                    <groupId>joda-time</groupId>
                    <artifactId>joda-time</artifactId>
                    <version>1.6.2</version>
                    <scope>provided</scope>
            </dependency>

每当我为我的 pom 运行任何阶段(例如“mvn install”)时,应用程序总是会尝试下载一些有关依赖项的元数据……

Downloading: http://repo.spring.io/milestone/joda-time/joda-time/maven-metadata.xml

我如何告诉 Maven 停止这样做?我已经在本地 Maven 存储库中缓存了工件。

谢谢,- 戴夫

【问题讨论】:

你读过Introduction to the Dependency Mechanism吗?也许 Transitive Dependencies 适用于此。 或者是为了提醒您查看.xml 发现joda-time 1.6.2 已经有四年了,最新版本是2.5。 ;-) 检查存储库的配置并查看是否以任何方式设置了 updatePolicy。 我的任何存储库中都没有“updatePolicy”设置。另外,我不得不使用旧的 joda-time,因为那是 JBoss 7.1.3.Final 正在使用的版本。 添加存储库配置(可能来自settings.xml)肯定有助于解决问题。 【参考方案1】:

也许需要明确指定更新策略。看到这个答案:Why is Maven downloading the maven-metadata.xml every time?

<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>

【讨论】:

如果您在同一天构建两个或更多快照会怎样? 这在我的情况下不起作用。我的 POM 中有两个存储库,第一个从超级 POM 重复 Maven Central 定义,以便首先找到它(因为在项目 POM 中定义的存储库在来自超级 POM 的存储库之前被查询)。尽管如此,即使 Central 包含我的工件,它们已经在本地缓存,我将更新策略配置为从不甚至用特定版本替换我的版本范围,始终下载来自自定义存储库的元数据。我的 settingx.xml 中没有存储库。 好的,它确实有效。起初我没有意识到的是,我自己的 POM 没有版本范围,但一些传递的有。我不得不在我的 POM 的dependencyManagement 部分修复他们的版本,然后最后 Maven 停止尝试下载元数据文件。我写这篇文章是为了让大家遇到同样的情况,而不是仅仅删除我之前的评论。【参考方案2】:

这意味着在您的依赖关系树中的某个地方使用了 SNAPSHOT 或版本范围(直接或作为传递依赖项)。对于这两种情况,解决方案是相同的:将版本锁定到特定版本。你是把它锁定为直接依赖还是在dependencyManagement中?

【讨论】:

就我而言,aws-java-sdk-core 依赖于使用版本范围的 joda-time。排除来自 aws-java-sdk-core 的依赖项并直接在我的 POM 中包含锁定版本的 joda-time 解决了此问题。 与版本范围的传递依赖是我的问题,在接受的答案下查看我的 cmets。感谢您的回答,这对我弄清楚发生了什么很有帮助。

以上是关于如何防止 Maven 为我的仓库中已有的工件下载 maven-metadata.xml?的主要内容,如果未能解决你的问题,请参考以下文章

m2eclipse 找不到 Maven 依赖项,找不到工件

如何让工件更新虚拟仓库的 maven-metadata.xml?

无法从发布仓库下载依赖工件

如何利用maven向本地仓库导入官网没有的jar包

如何为 GitLab CI 运行器启用 Maven 工件缓存?

如何防止从表中已有的值派生的表中的某些值组合?