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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Я считаю, что добиться этого с помощью пакетного сценария выглядит легко.Надеюсь, что приведенный ниже скрипт работает на вас.

@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

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

0 голосов
/ 06 февраля 2019

Ниже приведен полноценный пакетный файл, использующий ответ 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 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
0 голосов
/ 24 января 2019

У меня есть одна идея, чтобы решить вашу проблему, и, возможно, вам не нужен командный файл для выполнения этой работы. Вы можете создать расширение Maven Core и создать библиотеку EventSpy для выполнения --resume-from при сбое сборки. Я уже проверял этот пример, найденный в этом ответе Запустите плагин maven при сбое сборки

На основании этого ответа вы можете использовать Maven Invoker Maven Invoker

пока ... Я нашел расширение для безопасных параллельных сборок Пример расширений Maven Core для безопасных параллельных сборок

Я знаю, что вам нужна информация о проекте ... поэтому, заглянув внутрь ExecutionEvent и MavenProject , у нас есть вся информация о текущем проекте здания.

Надеюсь, это сработает и для вас.

Edit:

Я ищу какое-то расширение, которое реализует это поведение «автоматически повторять» при сбое какого-либо модуля. Если я ничего не найду, мы должны создать расширение для этого.

...