可以Maven 3重新下载损坏的文件而不是失败的构建?

Now*_*ker 9 continuous-integration maven-3 maven

[WARNING] The POM for org.testng:testng:jar:5.14.10 is invalid,
          transitive dependencies (if any) will not be available: 1 problem was
          encountered while building the effective model for
          org.testng:testng:5.14.10

[FATAL]   Non-readable POM
          /home/teamcity/.m2/repository/org/sonatype/oss/oss-parent/3/oss-parent-3.pom:
          input contained no data @
          /home/teamcity/.m2/repository/org/sonatype/oss/oss-parent/3/oss-parent-3.pom
Run Code Online (Sandbox Code Playgroud)

发生了损坏的文件~/.m2,每个人都知道.修复它就像删除损坏的文件一样容易,因此Maven可以重新下载它.但是,我不想手动grep日志,连接到构建代理并手动删除这些文件.可靠的构建应该能够处理这些问题.

有没有办法让Maven重新下载损坏的文件而不是失败的构建?我不希望~/.m2在执行每个构建之前删除它,因为它会使构建非常慢.

为什么会这样?我的一位客户的基础设施已经破损.虚拟机经常重启,没有任何通知.由于构建大多数时间都在执行,因此文件在例如中被破坏~/.m2.在这件事上我无法改变,这是他们的服务器和他们的政策 - 或者只是无能.但是我必须手动修复构建.

Ste*_*lly 4

直到 Maven 3.0.4 为止,还没有办法通过一次调用 Maven 来解决这个问题。

您可以做的是编写一个聚合器插件,逐步遍历反应器中的每个模块,并通过 API 调用(而不是 mojo 注释)解决它们的依赖关系,从而允许捕获故障并清除和重试。

它不会捕获所有情况(例如插件依赖项),但如果你做了类似的事情

$ mvn org.mine.maven:resolve-all:resolve-all || rm -rvf ~/.m2/repository
$ mvn clean verify
Run Code Online (Sandbox Code Playgroud)

这样会更可靠。

如果您很高兴需要 Maven 3.x,您可以编写一个构建扩展并将其放入,构建扩展可以执行与插件相同的技巧,但因为它在插件解析之前$MAVEN_HOME/lib运行,所以它可以捕获带有插件的情况。

大量的工作,就我个人而言,良好的 MRM 使得重新下载变得愚蠢而快速,在使用 Maven 的 8 年中,我可能有 3-4 次本地存储库损坏......而在这些时间中,除了一次之外,所有这些时间都是我在其中拥有多个存储库的情况播放和元数据 (pom) 从一个解析,而工件从另一个解析...只有一种情况是“错误下载的 HTML”...所有这些都会被 MRM 停止