it-swarm.com.ru

Запуск пакетного скрипта Windows с использованием плагина Maven exec блокирует сборку, даже если скрипт использует "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>

Это вызовет скрипт, который содержит только

начать вызов 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

19
Edmondo1984

Смотрите этот вопрос: Как мне запустить командный файл из моего Java-приложения?

Пакетные файлы Windows не являются исполняемыми. Это скрипты, которые запускаются исполняемым файлом cmd.

Дополнительная информация

Плагин Exec исходный код показывает, что Apache Commons Executor используется для фактического выполнения командной строки. 

Здесь вы можете много читать, например, в документации по Apache Commons Executor и их проблемах с JIRA , но короткая версия: это не проблема с «Maven», это проблема с платформой -зависимый характер выполнения команды exec()

Я уже сталкивался с такой проблемой раньше, и решение, которое я всегда разрабатываю, состоит в том, чтобы деконструировать скрипт .bat в его действительные команды и запускать его непосредственно из плагина exec, а не вызывать скрипт.

6
noahlz

плагин exec не может этого сделать, и я тоже нашел для него проблему: http://jira.codehaus.org/browse/MEXEC-87

В выпуске jira, связанном выше, есть упоминание и ссылка на плагин для exec, который будет иметь функциональность. 

Кроме этого, я думаю, вам пока нужно использовать плагин antrun. 

Вот пример, взятый из рабочей конфигурации и работающий с mvn verify. Это должно быть в <plugins>, а не <pluginManagement> (exec может находиться в управлении плагином просто отлично).

<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.

18
eis

В моем случае у меня были проблемы с npm и ng. Основная проблема заключалась в том, что exec-maven-plugin пытался выполнить сценарии sh (которые не имели расширений). 

Переименование 

C:\Users\User\AppData\Roaming\npm\ng to C:\Users\User\AppData\Roaming\npm\ng.sh

а также

C:\apps\nodejs\npm to C:\apps\nodejs\npm.sh

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

1
Anand Rockzz

Код нахождения работает на меня 

<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

0
Vsegar