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

时间:2019-01-22 09:48:10

标签: java maven batch-file build maven-plugin

我正在做一个大型的Maven项目,该项目由许多不同的模块组成。 Maven构建在某些模块上间歇性地失败,但是如果一切顺利,一个简单的手动调用'pack_operation_product_ids', '=', 'o.pack_operation_product_ids'(有时在几个不同的模块上)将使其继续成功。

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

问题:是否可以让Maven从发生故障的模块中自动重试(可能只有一次,或者最多3次)?

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

3 个答案:

答案 0 :(得分:5)

我有一个主意来解决您的问题,也许您不需要批处理文件即可完成工作。您可以创建一个Maven核心扩展,并创建一个EventSpy库,以在构建失败时执行--resume-from。 我已经测试了在此答案Run a maven plugin when build fails

中找到的示例

根据此答案,您可以使用Maven Invoker Maven Invoker

但是...我发现了安全并行构建Maven Core Extensions Example for Safe Parallel Builds

的扩展

我知道您需要项目信息...因此,在ExecutionEventMavenProject类的内部,我们可以获得有关当前建筑项目的所有信息。

我希望它也对您有用。

编辑:

我正在寻找一些扩展,该扩展可在某些模块发生故障时“自动重试”实现此行为。如果我什么都没找到,我们应该为它创建一个扩展。

答案 1 :(得分:2)

下面是一个完全成熟的批处理文件,以Anitha.R's answer作为起点。

使用说明:

  1. 确保Maven可执行文件位于Windows path中。
  2. 理想情况下,还请确保Windows路径中存在用于Windows的tee版本。 (例如,我使用的是Git for Windows的一部分,并将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

答案 2 :(得分:1)

我相信使用批处理脚本实现此目标看起来很容易。希望以下脚本为您工作。

@echo off
setlocal enabledelayedexpansion
for /f "tokens=2 delims=:" %%i in ('call mvn clean install ^| find "mvn <goals> -rf"') do (
    call mvn clean install -e -rf : %%i
)
endlocal

很遗憾我没有测试过。