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

Maven 3是否可以重新下载损坏的文件,而不是使构建失败?,maven,continuous-integration,maven-3,Maven,Continuous Integration,Maven 3,损坏的文件发生在~/.m2中,每个人都知道这一点。修复它就像删除损坏的文件一样简单,这样Maven就可以重新下载它。但是,我不想手动grep日志,连接到构建代理并手动删除这些文件。可靠的构建应该能够处理此类问题 有没有办法让Maven重新下载损坏的文件,而不是让构建失败?我不想在执行每个构建之前删除~/.m2,因为这会使构建非常缓慢。 为什么会这样?我的一个客户的基础设施坏了。虚拟机经常在没有任何通知的情况下重新启动。而且由于构建大部分时间都在执行,因此文件会在以下情况下损坏:例如,~/.m2。

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

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


为什么会这样?我的一个客户的基础设施坏了。虚拟机经常在没有任何通知的情况下重新启动。而且由于构建大部分时间都在执行,因此文件会在以下情况下损坏:例如,
~/.m2
。在这件事上,我没有什么可以改变的,那就是他们的服务器和他们的政策——或者只是无能。但是我必须手工修复构建。

到Maven 3.0.4为止,一次调用Maven就无法解决这个问题

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

它不会捕获所有情况(例如插件依赖项),但如果您执行类似的操作

[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
这样会更可靠

如果您愿意要求Maven 3.x,您可以编写一个构建扩展并将其放入
$Maven_HOME/lib
中,构建扩展可以执行与插件相同的技巧,但因为它在插件解析之前就已经开始使用,所以它可以捕获插件的情况


大量的工作,就个人而言,一个好的MRM使重做速度很快,而且在使用Maven的8年中,我可能已经发生了3-4次本地回购腐败。。。在这些时间里,我有多个存储库,元数据(pom)从一个存储库中解析,而工件从另一个存储库中解析。。。只有一个案例是“错误下载HTML”。。。所有这些都会被MRM阻止

这种情况经常发生吗?在我的实践中,虽然我每天在几个不同的项目上使用maven,但我只需要做几次。但拥有可靠的构建总是更好的,这样您就不需要直接接触构建代理。拥有自己的存储库管理器并确保所有工件(及其pom文件)都处于良好状态更好,因此即使您在新机器上启动构建,您也会得到预期的结果。但回到你的问题,我不知道有任何插件可以做到这一点。请尝试
mvn依赖项:清除本地存储库
,更多详细信息请参见。你可以教构建代理“grep日志并删除这些文件”。这取决于代理的可配置程度。我使用,它很好地解决了这类问题,允许在maven构建之后运行自定义脚本。谢谢。我认为这种
resolve all | | rm-rf
方式已经足够好了。或者可以通过
resolve all | | purge local repository
进行改进,因为它可以保存当前构建的项目中未引用的工件。仅供参考:我添加了一个说明,说明了为什么损坏的文件在这里很常见。
$ mvn org.mine.maven:resolve-all:resolve-all || rm -rvf ~/.m2/repository
$ mvn clean verify