Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使Maven自动重试(从失败的模块恢复)?_Java_Maven_Batch File_Build_Maven Plugin - Fatal编程技术网

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

Java 如何使Maven自动重试(从失败的模块恢复)?,java,maven,batch-file,build,maven-plugin,Java,Maven,Batch File,Build,Maven Plugin,我正在从事一个由许多不同模块组成的大型Maven项目。Maven构建在某些模块上间歇性失败,但如果一切正常,一个简单的手动调用的--从恢复(有时在几个不同的模块上)将允许它继续成功 我故意忽略了发生这种情况的具体原因——我怀疑这可能是因为Windows文件锁定了目标文件夹中的文件——但这不是问题的重点 问题:是否可以让Maven自动重试(可能只重试一次,或者最多重试3次),从失败的模块中恢复 想法:目前我唯一能想到的方法是通过批处理文件,该文件读取最后一行,并以某种方式提取模块名称以继续,但这看

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

我故意忽略了发生这种情况的具体原因——我怀疑这可能是因为Windows文件锁定了目标文件夹中的文件——但这不是问题的重点

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


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

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

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

然而。。。我找到了安全并行构建的扩展

我知道你需要项目信息。。。所以从课堂上看,我们有关于当前建筑项目的所有信息

我希望这对你也有用

编辑:


我正在寻找一些扩展,当某个模块出现故障时,该扩展可以实现这种行为“自动重试”。如果我找不到任何东西,我们应该为此创建一个扩展。

我相信使用批处理脚本实现这一点看起来很容易。希望下面的脚本适合你

@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
@echo关闭
延迟扩展
对于/f“tokens=2 delims=:”%%i in('call mvn clean install^ | find“mvn-rf”)do(
调用mvn清理安装-e-rf:%%i
)
端部

很抱歉,我没有测试它。

下面是一个完整的批处理文件,用作起点

使用说明:

@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
  • 确保Maven可执行文件位于中
  • 理想情况下,还要确保Windows路径中有一个版本的tee for Windows。(例如,我正在使用作为的一部分提供的,已将Git的
    usr\bin
    文件夹添加到我的路径中)
  • 将批处理文件代码复制到新文件中
  • 根据需要更改
    max_retries
  • 在Windows路径的文件夹中另存为“mvnretry.bat”
  • 以与相同的方式运行,例如
    mvnretry clean安装-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
    
    @echo关闭
    延迟扩展
    设置最大重试次数=3次
    设置重试次数=0
    设置输出文件=%date:/=%time::=%
    设置输出文件=%output\u file:=0%
    设置输出文件=%temp%\mvn%output\u文件:.=%.out
    设置mvn_命令=调用mvn%*
    设置tee_found=true
    where/q发球台
    如果不是错误级别1,请转到重试
    设置tee_found=false
    在系统路径^中找不到echo tee.exe!生成将继续,但输出将延迟。。。
    :重试
    回显%mvn\u命令%
    如果%tee\u找到%==true(
    %mvn_命令%| tee%输出_文件%
    )否则(
    %mvn_命令%>%输出_文件%
    类型%output\u file%
    )
    回显解析输出。。。
    设置“resume_from=”
    对于/f“tokens=2 delims=:”%%i in('type%output_file%^ | find“mvn-rf”')do(
    设置resume_from=%%i
    )
    如果!重试计数!LSS%max_重试次数%(如果不是[%resume_from%]=[](
    正在从%resume\u%恢复回显。。。
    设置/a重试次数=重试次数+1
    设置/a重试次数=最大重试次数-重试次数
    回显重试…[使用的重试次数:!重试次数!剩余重试次数:!剩余重试次数!]
    set mvn_命令=调用mvn-rf:%resume_from%%*
    转到重试
    )
    删除/q%输出文件%
    端部
    
    这可能需要一些调整,但对我来说,这似乎是阻力最小的路径。(如果我能让它可靠地工作,并可能包括重试等,我以后可能会发布我自己的答案)更新:这里写的代码对我来说不起作用,但提供了一个很好的起点。现在已经发布了一个带有修改版本的。使用Maven 4.0.0(2021年第1季度)应该会更容易:请参阅