Как заставить Maven автоматически повторить попытку (возобновить работу с неисправного модуля)?
Я работаю над большим проектом Maven, состоящим из нескольких различных модулей. Сборка Maven периодически завершается сбоем на определенных модулях, но если все в порядке, простой ручной --resume-from
(иногда на нескольких разных модулях) позволит продолжить работу.
Я намеренно опускаю детали того, почему именно это происходит - подозреваю, что это может быть связано с блокировкой файлов Windows на файлах в целевой папке - но это не главное.
Вопрос: Возможно ли заставить Maven автоматически повторить попытку (возможно, только один раз или, возможно, до 3 раз), возобновляя работу из неисправного модуля?
Мысли: Единственный способ, которым я сейчас могу думать, это сделать через командный файл, который читает последнюю строку и каким-то образом извлекает имя модуля для продолжения, но это не выглядит легким. Не хотите изобретать велосипед, и вам было интересно, есть ли хороший плагин Maven, который уже работает?
Ответы
Ответ 1
Ниже приведена попытка создания полноценного командного файла с использованием ответа Anitha.R в качестве отправной точки.
Инструкция по применению:
- Убедитесь, что исполняемый файл Maven находится в пути Windows.
- В идеале также убедитесь, что версия тройника для Windows находится в пути Windows. (Например, я использую тот, который предоставляется как часть Git для Windows, добавив папку Git
usr\bin
в мой путь). - Скопируйте код пакетного файла в новый файл.
- Измените значение
max_retries
по желанию. - Сохранить как "mvnretry.bat" в папке в пути Windows.
- Запустите так же, как Maven, например,
mvnretry clean install -Pmyprofile -DskipTests
.
Код пакетного файла:
@echo off
setlocal enabledelayedexpansion
set max_retries=3
set retry_count=0
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 %temp%\mvn.out
) else (
%mvn_command% > %temp%\mvn.out
type %temp%\mvn.out
)
echo Parsing output...
set "resume_from="
for /f "tokens=2 delims=:" %%i in ('type %temp%\mvn.out ^| 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 %temp%\mvn.out
echo All finished ^^!
endlocal
Ответ 2
У меня есть одна идея, чтобы решить вашу проблему, и, возможно, вам не нужен командный файл для выполнения этой работы. Вы можете создать расширение Maven Core и создать библиотеку EventSpy для выполнения --resume-from при сбое сборки. Я уже опробовал этот пример нашел в этом ответе Запуск Maven плагин при сбое сборки
На основании этого ответа вы можете использовать Maven Invoker Maven Invoker
пока... Я нашел расширение для безопасных параллельных сборок Пример расширений Maven Core для безопасных параллельных сборок
Я знаю, что вам нужна информация о проекте... поэтому, заглянув внутрь классов ExecutionEvent и MavenProject, мы имеем всю информацию о текущем проекте здания.
Я надеюсь, что это сработает и для вас.
Редактировать:
Я ищу какое-то расширение, которое реализует это поведение "автоматически повторять", когда какой-то модуль выходит из строя. Если я не нахожу ничего, мы должны создать расширение для этого.
Ответ 3
Я считаю, что добиться этого с помощью пакетного сценария выглядит легко. Надеюсь, что приведенный ниже скрипт работает на вас.
@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
Сожалею, что я не проверял это.