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