Запуск пакета Windows script с использованием плагина Maven exec блокирует сборку, даже если script использует "start"
Я пытаюсь выполнить дегустацию интеграции развертывания моего приложения в верхней части пользовательского контейнера. Поскольку мой контейнер является обычным я не могу использовать плагин Maven Cargo для настройки контейнера.
Мой контейнер:
- Должен быть запущен с помощью соответствующего файла bat, который находится на пути машины, на которой выполняются тесты.
- Может быть закрыт вручную, так как у меня есть один модуль maven, содержащий все мои тесты интеграции, даже если однажды мне хотелось бы знать, как закрыть процесс после завершения моих тестов.
Моя проблема в том, что я должен запускать свой контейнер в другом процессе, потому что он должен продолжать работать, пока мои тесты выполняются. Кроме того, у меня есть API в моих тестах, которые позволяют мне ждать, пока контейнер будет готов (своего рода поиск с таймаутом).
Я добавил следующие строки в мой pom.xml
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<phase>pre-integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>scripts/start-agent.bat</executable>
</configuration>
</plugin>
Это вызовет script, который содержит только
начать вызов gs-agent.bat
Однако плагин mvn exec застревает, а мои тесты не выполняются. В соответствии с тем, что предлагается в Как запустить пакетный файл из моего Java-приложения?, я изменил свой pom.xml следующим образом:
<configuration>
<executable>cmd</executable>
<arguments>
<argument>/C</argument>
<argument>start</argument>
<argument>gs-agent.bat</argument>
</arguments>
</configuration>
Но это, похоже, не решает проблему:
![Maven halted]()
Ответы
Ответ 1
Смотрите этот вопрос: Как запустить пакетный файл из моего Java-приложения?
Пакетные файлы Windows не исполняются. Это скрипты, выполняемые исполняемым файлом cmd
.
Дополнительная информация
Exec plugin исходный код показывает, что Apache Commons Executor используется для фактического выполнения командной строки.
Здесь вы можете много читать, то есть в документации Apache Commons Executor и их JIRA, но короткая версия: это не проблема с "Maven", это проблема с зависящей от платформы характером выполнения команды exec()
.
Я решил эту проблему раньше, и решение, которое я всегда разрабатываю, состоит в том, чтобы деконструировать .bat
script в его фактические команды и запустить его непосредственно из плагина exec
, а не вызвать script.
Ответ 2
exec plugin не может этого сделать, и я нашел для него проблему: http://jira.codehaus.org/browse/MEXEC-87
В проблеме jira, связанной выше, есть упоминание и ссылка вилки для плагина exec, которая будет иметь функциональность.
Кроме этого, я думаю, вам нужно будет использовать antrun-plugin.
Вот пример, взятый из рабочей конфигурации и выполняемый с mvn verify
. Это должно быть в <plugins>
, а не <pluginManagement>
(exec может находиться в pluginmanagement просто отлично).
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>pre-integration-test</phase>
<configuration>
<target>
<exec executable="cmd.exe"
spawn="true">
<arg value="/c"/>
<arg value="D:\myfolder\test.bat"/>
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Обратите внимание, что spawn="true"
здесь ключевое значение, если вы не хотите, чтобы выполнение блокировалось, как указано в вопросе. Если вы хотите, чтобы он немедленно блокировал и отображал результат, установите для него значение false.
Ответ 3
В соответствии с плагином exec maven документация:
exec:exec execute programs and Java programs in a separate process.
exec:java execute Java programs in the same VM.
Прочитайте полную документацию о exec: exec здесь
Ответ 4
Для меня работает The Fallowing Code
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<configuration>
<tasks>
<exec dir="${project.basedir}" executable="Script.bat" failonerror="true">
</exec>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Источник https://maven.apache.org/guides/mini/guide-using-ant.html
Ответ 5
В моем случае у меня были проблемы с npm и ng.. Основная проблема заключалась в том, что exec-maven-plugin
пытался выполнить скрипты sh (у которых не было расширений).
Переименование
C:\Users\User\AppData\Roaming\npm\ng
до C:\Users\User\AppData\Roaming\npm\ng.sh
и
C:\apps\nodejs\npm
to C:\apps\nodejs\npm.sh
решил проблему.