Процесс, порожденный exec-maven-plugin, блокирует процесс maven - PullRequest
16 голосов
/ 30 марта 2012

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

  1. этап предварительной интеграции: запуск приложения на основе Java с использованием основного класса (с использованием exec-maven-plugin)
  2. этап интеграции: запуск тестов интеграции (с помощью maven-failsafe-plugin)
  3. Фаза после интеграции: корректно остановите приложение (используя 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-интеграционный тест, мое приложение запускается как дочерний процесс процесса 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?

Ответы [ 4 ]

3 голосов
/ 25 апреля 2018

Вы можете использовать параметр конфигурации 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>
2 голосов
/ 20 января 2015

(только для 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}
1 голос
/ 16 февраля 2018

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

1 голос
/ 30 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...