Выполнить несколько проектов maven из файла bat bat?
Мне нужно построить 3 независимых проекта maven, используя файл build.bat(из-за агрегации tycho не вариант - см. комментарии к запросу romaintaz). Я пробовал (выполнен из папки сборки - см. Ниже):
cd ../projectA
mvn clean install -U
cd ..
cd ../projectB
mvn clean install -U
cd ..
cd ../projectC
mvn clean install -U
где структура папок проектов:
build
|--> build.bat
projectA
|--> pom.xml
projectB
|--> pom.xml
projectC
|--> pom.xml
но только projectA - это проект projectB, а projectC пропускаются. Любые идеи о том, как изменить вышеуказанный batfile, чтобы следующий проект был построен, если предыдущий был успешно сгенерирован?
Ответы
Ответ 1
Используйте команду call
для выполнения ваших процессов mvn, например:
call mvn clean install -U
См
help call
для дальнейших объяснений команды вызова.
Чтобы избежать всех этих команд cd
, вы также можете использовать опцию -f
, чтобы указать путь к вашему pom, например
call mvn -f <path>/projectA/pom.xml clean install -U
call mvn -f <path>/projectB/pom.xml clean install -U
call mvn -f <path>/projectC/pom.xml clean install -U
Ответ 2
Как отмечено выше, вам нужно использовать "call" для запуска mvn script, как в:
call mvn package
Чтобы ловить ошибки, вам нужно использовать переменную ERROR_LEVEL
, как в:
call mvn clean
echo Exit Code = %ERRORLEVEL%
if not "%ERRORLEVEL%" == "0" exit /b
Подробнее см. http://jojovedder.blogspot.com/2009/03/executing-multiple-mvn-commands-from.html.
Ответ 3
Почему вы не пытаетесь создать родительский проект агрегации?
Кажется, у вас есть следующая структура:
someDirectory
+- projectA
+- pom.xml
+- projectB
+- pom.xml
+- projectC
+- pom.xml
Просто создайте pom.xml
в корневом каталоге (someDirectory
в моем примере) и определите список модулей, которые являются projectA
, projectB
и projectC
. Этот pom будет выглядеть так:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>my.company</groupId>
<artifactId>my-aggregation-project</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>projectA</module>
<module>projectB</module>
<module>projectC</module>
</modules>
</project>
заметки:
- Не забудьте установить
<packaging>pom</packaging>
, так как это не настоящий проект Java.
- Имя
module
должно совпадать с именем каталога, в котором размещен подмодуль.
Теперь, выполнив это, при запуске команды Maven в корневом каталоге Maven автоматически запустит эту команду на всех модулях. Поэтому, если вы просто запустите mvn clean install
в корневом каталоге, он запустит эту команду в трех ваших модулях.
Важное примечание: Я говорю здесь о функции агрегации Maven. Не наследование. Это означает, что не требуется, чтобы каждый модуль имел корневой проект как родительский.
Ответ 4
Используйте "вызов", когда вы хотите вызывать другой пакетный файл в родительском файле, чтобы элемент управления был возвращен родительскому пакетному файлу, и он продолжит выполнение.
например, вызов mvn clean install
Ответ 5
Я думаю, что использование% ERRORLEVEL% завершит + FrVaBe ответ. Первоначально из Kunal
call mvn -f ProjectA\pom.xml clean install if not "%ERRORLEVEL%" == "0" goto error
call mvn -DskipTests=true -f ProjectC\pom.xml clean install if not "%ERRORLEVEL%" == "0" goto error
exit
:error @echo Build Failed pause
Ответ 6
Поскольку ваши проекты находятся на одном уровне с каталогом, вы не должны перемещаться дважды. Вы поднимаетесь через cd ..
, а затем снова поднимаетесь на один уровень, чтобы войти в следующий проект, выполнив cd ../projectX
.
Либо удалите cd ..
в промежутке, либо измените cd в папку проекта в cd ./projectX
(текущий каталог вместо родительского каталога)
Кстати, вам действительно нужно использовать bat файл для этого? Рассматривали ли вы мультимодальный pom?
Ответ 7
FrVaBe ответил очень хорошо. Если вы хотите сохранить свою структуру кода, из-за некоторых других действий, таких как копирование артефактов, решение будет:
cd ../projectA
call mvn clean install -U
echo Do some stuff with artifacts
cd ..
cd ../projectB
call mvn clean install -U
echo Do some stuff with artifacts
cd ..
cd ../projectC
call mvn clean install -U
echo Do some stuff with artifacts
Здесь наиболее важна функция call, которая используется для выполнения сборки maven как своего рода подпрограммы, которая заканчивается обратно в ваш bat файл и не полностью завершается.