在maven下载依赖项时,其中一个依赖项由于网络问题而失败:
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-failsafe-plugin/2.16/maven-failsafe-plugin-2.16.pom
Plugin org.apache.maven.plugins:maven-failsafe-plugin:2.16 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-failsafe-plugin:jar:2.16
我想重试n
次,此时n
将是可配置的。如何执行此操作?
5条答案
按热度按时间zzlelutf1#
我在Gitlab CI/CD中遇到了类似的问题。这似乎已经解决了这个问题:
从3.2版开始,可以使用系统属性配置重试处理程序:
...
maven.wagon.http.retryHandler.count
=默认或标准实现的重试次数。其他HTTP客户端设置如下所述:https://maven.apache.org/wagon/wagon-providers/wagon-http/
**编辑:**正如keiki在评论中指出的,
3
似乎是默认值,因此不清楚设置此值是否有帮助。请结合您的经验进行评论。t0ybt7op2#
由于keep-alive连接被关闭,Maven似乎在获取依赖项方面存在问题。当您在构建环境(Docker,Azure,Jenkins)中运行
mvn
并且构建时间相当长(〉5分钟)时会发生这种情况。使用此maven标志禁用HTTP请求的keep-alive,看看它是否解决了您的问题:
其他人也提到了使用这个标志:
举个例子
Source of the original solution for azure
gxwragnw3#
如果您在NAT后的环境中运行,并且NAT超时很短,那么一种可能性是设置
-Dmaven.wagon.httpconnectionManager.ttlSeconds=25
,而不是禁用maven中的http连接池。在apache/pulsar repository中使用:
在WAGON-545的最后一条评论中,它说“Azure用户应将TTL设置为240秒或更少。”
7kqas0il4#
让我提出一个替代解决方案:
在您的本地网络中设置Nexus或Artifactory服务器。让您的构建通过它运行。它将缓存所有使用过的工件,以便大大降低遇到网络问题的风险。
piok6c0g5#
如果这是在一个足够新的Maven(3.9或更高版本)中的一个较长的构建中,并且你这样做是因为在Azure上构建(例如,在Github Actions中使用标准运行器),那么你遇到了一个陈旧连接的问题;Azure中有一个防火墙,它会悄悄地丢弃长期不活动的连接,任何超过半分钟左右的空闲连接都有风险。上面还有其他解决方案,但它们不起作用,因为Maven现在使用Aether库进行HTTP连接,而不是Wagon。
我现在已经在我的代码中部署的修复是使用
-Daether.connector.http.connectionMaxTtl=25
为Java代码设置一个系统属性。这似乎可以做到这一点。(正如你从this page中看到的那样,默认情况下,Aether将重试连接三次。这在Azure中没有帮助,但在其他情况下是有用的。)**在Github Actions工作流中,**最简单的方法是通过工作流文件中的顶级
env
设置,以便将其应用于对Maven的所有调用:(If如果你在
MAVEN_OPTS
中放入了其他东西,那么你需要合并这些东西。我发现上面的方法很好,而且可读性很好,每行一个系统属性。)