如何让Maven自动重试(从失败的模块恢复)?

2022-09-02 10:54:32

我正在开发一个由许多不同模块组成的大型Maven项目。Maven构建在某些模块上间歇性地失败,但如果一切顺利,一个简单的手动调用(有时在几个不同的模块上)将允许它继续成功。--resume-from

我故意省略了发生这种情况的确切原因的详细信息 - 怀疑这可能是由于Windows文件锁定目标文件夹中的文件 - 但这不是问题的重点。

问题:是否有可能让 Maven 自动重试(可能只有一次,或者最多 3 次),从失败的模块恢复?

思潮:我目前能想到的唯一方法是通过批处理文件,它读取最后一行并以某种方式提取模块名称以从中恢复 - 但这看起来并不容易。不想重新发明轮子,想知道是否有一个不错的Maven插件已经完成了这项工作?


答案 1

我有一个想法来解决你的问题,也许你不需要批处理文件来完成这项工作。您可以创建一个 Maven 核心扩展并创建一个 EventSpy 库,以便在构建失败时执行 --resume-from。。我已经测试了这个例子,在这个答案中找到 当构建失败时运行一个maven插件

基于这个答案,你可以使用Maven Invoker Maven Invoker

还。。。我发现了安全并行构建的扩展 Maven 核心扩展安全并行构建的示例

我知道你需要项目信息...因此,在ExpercutIveVentMavenProject类中,我们有关于当前建筑项目的所有信息。

我希望它也能为你工作。

编辑:

我正在寻找一些扩展,当某些模块失败时,实现此行为“自动重试”。如果我没有找到任何东西,我们应该创建一个扩展。


答案 2

下面是一个完全成熟的批处理文件,使用Anitha.R的答案作为起点。

使用说明:

  1. 确保 Maven 可执行文件位于 Windows 路径中。
  2. 理想情况下,还要确保 Windows 的 T 恤版本位于 Windows 路径中。(例如,我使用作为Windows的Git的一部分提供的那个,将Git的usr\bin文件夹添加到我的路径中)。
  3. 将批处理文件代码复制到新文件中。
  4. 根据需要更改值。max_retries
  5. 在 Windows 路径的文件夹中另存为“mvnretry.bat”。
  6. 以与 Maven 相同的方式运行,例如 .mvnretry clean install -Pmyprofile -DskipTests

批处理文件代码:

@echo off
setlocal enabledelayedexpansion
set max_retries=3
set retry_count=0
set output_file=%date:/=%%time::=%
set output_file=%output_file: =0%
set output_file=%temp%\mvn%output_file:.=%.out
set mvn_command=call mvn %*
set tee_found=true
where /q tee
if not errorlevel 1 goto retry
  set tee_found=false
  echo tee.exe not found in system path^^! Build will continue but output will be delayed...
:retry
  echo %mvn_command%
  if %tee_found%==true (
    %mvn_command% | tee %output_file%
  ) else (
    %mvn_command% > %output_file%
    type %output_file%
  )
  echo Parsing output...
  set "resume_from="
  for /f "tokens=2 delims=:" %%i in ('type %output_file% ^| find "mvn <goals> -rf"') do (
    set resume_from=%%i
  )
  if !retry_count! LSS %max_retries% if not [%resume_from%] == [] (
    echo Resuming from %resume_from%...
    set /a retry_count=retry_count+1
    set /a retries_remaining=max_retries-retry_count
    echo Retrying... [retries used: !retry_count!, retries remaining: !retries_remaining!]
    set mvn_command=call mvn -rf :%resume_from% %*
    goto retry
  )
del /q %output_file%
endlocal

推荐