Процесс, порожденный exec-maven-plugin, блокирует процесс maven

Я пытаюсь выполнить следующий сценарий с помощью maven:

  1. предварительная фаза интеграции: запуск приложения на основе Java с использованием основного класса (с использованием exec-maven-plugin)
  2. этап интеграции: запустить тестовые примеры интеграции (используя maven-failsafe-plugin)
  3. post-integration-phase: корректно остановить приложение (используя exec-maven-plugin)

Вот фрагмент pom.xml:

    <plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
            <execution>
                <id>launch-myApp</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>exec</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <executable>java</executable>
            <arguments>
                <argument>-DMY_APP_HOME=/usr/home/target/local</argument>
                <argument>-Djava.library.path=/usr/home/other/lib</argument>
                <argument>-classpath</argument>
                <classpath/>
                <argument>com.foo.MyApp</argument>
            </arguments>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.12</version>
        <executions>
            <execution>
                <goals>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <forkMode>always</forkMode>
        </configuration>
    </plugin>
</plugins>

Если я выполняю mvn post-integration-test, мое приложение запускается как дочерний процесс процесса maven, но процесс приложения блокирует процесс maven от выполнения интеграционных тестов, которые наступают на следующем этапе. Позже я обнаружил, что есть ошибка (или отсутствует функциональность?) в плагине maven exec, из-за которой приложение процесс блокирует процесс maven. Чтобы решить эту проблему, я инкапсулировал вызов MyApp.java в сценарий оболочки, а затем добавил «/ dev / null 2> & 1 &», чтобы создать отдельный фоновый процесс. Вот фрагмент (это просто фрагмент, а не сам фрагмент) из runTest.sh:

java - DMY_APP_HOME =$2 com.foo.MyApp > /dev/null 2>&1 &

Хотя это решает мою проблему, есть ли другой способ сделать это? Мне не хватает аргументов для exec-maven-plugin?


person Arnab Biswas    schedule 30.03.2012    source источник


Ответы (4)


Вы можете использовать параметр конфигурации async для достижения того, что вам нужно. Также см. AsyncDestroyOnShutdown, который по умолчанию завершает работу приложения при выходе из JVM.

https://www.mojohaus.org/exec-maven-plugin/exec-mojo.html#async

Если установлено значение true, дочерний процесс выполняется асинхронно, а выполнение сборки продолжается параллельно.

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <executions>
            <execution>
                <id>launch-myApp</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>exec</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <executable>java</executable>
            <arguments>
                <argument>-DMY_APP_HOME=/usr/home/target/local</argument>
                <argument>-Djava.library.path=/usr/home/other/lib</argument>
                <argument>-classpath</argument>
                <classpath/>
                <argument>com.foo.MyApp</argument>
            </arguments>
            <async>true</async>
        </configuration>
    </plugin>
person CamW    schedule 25.04.2018

(Только для Unix) Используйте exec: exec и запустите сценарий. Этот сценарий должен вызывать

java -DMY_APP_HOME =$2 com.foo.MyApp > /dev/null 2>&1 &

сначала и проверьте запуск до завершения скрипта. Программа вылетела за 2 секунды?

Когда вашему java-приложению требуется время для запуска, вы можете добавить сценарий, ожидающий полного запуска.

   retrymax=30
   retry=0
   RETURNCODE=1
   while [ ${retry} -lt ${retrymax} ]; do
      todo_your_test
      RETURNCODE=$?
      if [ ${RETURNCODE} -eq 0 ]; then
         echo MyApp started
         break
      else
         (( retry = retry + 1 ))
         sleep 2
      fi
   done
   exit ${RETURNCODE}
person Walter A    schedule 20.01.2015

Я использую https://github.com/bazaarvoice/maven-process-plugin плагин, пока эта проблема еще открыта https://github.com/mojohaus/exec-maven-plugin/issues/18

person Tuno    schedule 16.02.2018
comment
В самом деле, хотя этот плагин может быть не таким гибким, как базовый плагин exec-maven-plugin, он гораздо лучше подходит для моих целей ... Спасибо за этот совет. - person Michael Piefel; 26.03.2018
comment
Это должен быть принятый ответ. Это охватывает полную фазу тестирования интеграции, включая ожидание запуска порожденных процессов. - person Sven Döring; 07.10.2019

В этом потоке есть возможное решение с использованием Ant: Возможное решение здесь: Maven и Exec: разветвление процесс?

Тот же недостаток, что и в вашем текущем решении, заключается в том, что оно также зависит от платформы. Ваше текущее решение будет работать только в Unix / Linux-подобных средах, в то время как решение на основе Ant запускает экземпляр cmd, который работает только в Windows. Используя профили Maven, можно, конечно, создать конфигурацию, которая использует ОС, в которой она работает, чтобы определить, какую командную оболочку запускать.

person nwinkler    schedule 30.03.2012
comment
Да ты прав. Windows будет проблемой с моим исправлением. - person Arnab Biswas; 30.03.2012