java Maven重试依赖项下载如果失败

kse8i1jr  于 2023-04-19  发布在  Java
关注(0)|答案(5)|浏览(183)

在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将是可配置的。如何执行此操作?

zzlelutf

zzlelutf1#

我在Gitlab CI/CD中遇到了类似的问题。这似乎已经解决了这个问题:

-Dmaven.wagon.http.retryHandler.count=3

从3.2版开始,可以使用系统属性配置重试处理程序:
...

    • maven.wagon.http.retryHandler.count =默认或标准实现的重试次数。

其他HTTP客户端设置如下所述:https://maven.apache.org/wagon/wagon-providers/wagon-http/

**编辑:**正如keiki在评论中指出的,3似乎是默认值,因此不清楚设置此值是否有帮助。请结合您的经验进行评论。

t0ybt7op

t0ybt7op2#

由于keep-alive连接被关闭,Maven似乎在获取依赖项方面存在问题。当您在构建环境(Docker,Azure,Jenkins)中运行mvn并且构建时间相当长(〉5分钟)时会发生这种情况。
使用此maven标志禁用HTTP请求的keep-alive,看看它是否解决了您的问题:

-Dhttp.keepAlive=false

其他人也提到了使用这个标志:

-Dmaven.wagon.http.pool=false

举个例子

mvn -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false clean package

Source of the original solution for azure

gxwragnw

gxwragnw3#

如果您在NAT后的环境中运行,并且NAT超时很短,那么一种可能性是设置-Dmaven.wagon.httpconnectionManager.ttlSeconds=25,而不是禁用maven中的http连接池。
在apache/pulsar repository中使用:

env:
  MAVEN_OPTS: -Dmaven.wagon.httpconnectionManager.ttlSeconds=25 -Dmaven.wagon.http.retryHandler.count=3

在WAGON-545的最后一条评论中,它说“Azure用户应将TTL设置为240秒或更少。”

7kqas0il

7kqas0il4#

让我提出一个替代解决方案:
在您的本地网络中设置Nexus或Artifactory服务器。让您的构建通过它运行。它将缓存所有使用过的工件,以便大大降低遇到网络问题的风险。

piok6c0g

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的所有调用:

env:
  MAVEN_OPTS: >
    -Daether.connector.http.connectionMaxTtl=25

(If如果你在MAVEN_OPTS中放入了其他东西,那么你需要合并这些东西。我发现上面的方法很好,而且可读性很好,每行一个系统属性。)

相关问题