Как заставить Maven автоматически повторить попытку (возобновить работу с неисправного модуля)? - программирование
Подтвердить что ты не робот

Как заставить Maven автоматически повторить попытку (возобновить работу с неисправного модуля)?

Я работаю над большим проектом Maven, состоящим из нескольких различных модулей. Сборка Maven периодически завершается сбоем на определенных модулях, но если все в порядке, простой ручной --resume-from (иногда на нескольких разных модулях) позволит продолжить работу.

Я намеренно опускаю детали того, почему именно это происходит - подозреваю, что это может быть связано с блокировкой файлов Windows на файлах в целевой папке - но это не главное.

Вопрос: Возможно ли заставить Maven автоматически повторить попытку (возможно, только один раз или, возможно, до 3 раз), возобновляя работу из неисправного модуля?

Мысли: Единственный способ, которым я сейчас могу думать, это сделать через командный файл, который читает последнюю строку и каким-то образом извлекает имя модуля для продолжения, но это не выглядит легким. Не хотите изобретать велосипед, и вам было интересно, есть ли хороший плагин Maven, который уже работает?

4b9b3361

Ответ 1

Ниже приведена попытка создания полноценного командного файла с использованием ответа Anitha.R в качестве отправной точки.

Инструкция по применению:

  1. Убедитесь, что исполняемый файл Maven находится в пути Windows.
  2. В идеале также убедитесь, что версия тройника для Windows находится в пути Windows. (Например, я использую тот, который предоставляется как часть Git для Windows, добавив папку Git usr\bin в мой путь).
  3. Скопируйте код пакетного файла в новый файл.
  4. Измените значение max_retries по желанию.
  5. Сохранить как "mvnretry.bat" в папке в пути Windows.
  6. Запустите так же, как 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

Сожалею, что я не проверял это.