18

maven を使用して次のシナリオを実行しようとしています:

  1. pre-integration-phase : メイン クラスを使用して Java ベースのアプリケーションを開始します (exec-maven-plugin を使用)。
  2. integration-phase : 統合テスト ケースを実行します (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 プロセスをブロックするため、maven exec プラグインにバグ (または機能の欠落?)があることがわかりました。この問題に対処するために、MyApp.java の呼び出しをシェル スクリプトにカプセル化し、「/dev/null 2>&1 &」を追加して別のバックグラウンド プロセスを生成しました。runTest.sh の抜粋 (これは単なる抜粋であり、実際のものではありません) は次のとおりです。

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

これで問題は解決しましたが、他に方法はありますか? exec-maven-plugin の引数がありませんか?

4

4 に答える 4

3

(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}
于 2015-01-20T15:20:37.990 に答える
1

このスレッドには、Ant を使用した可能な解決策があります: ここでの解決策: Maven and Exec: forking a process?

現在のソリューションと同じ欠点は、プラットフォームにも依存することです。現在のソリューションは Unix/Linux のような環境でのみ実行されますが、Ant ベースのソリューションはcmdWindows でのみ動作する のインスタンスを開始しています。もちろん、Maven プロファイルを使用すると、実行中の OS を使用して起動するコマンド シェルを決定する構成を作成できます。

于 2012-03-30T06:44:28.883 に答える