Подтвердить что ты не робот

Запуск пакета 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

4b9b3361

Ответ 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

решил проблему.