web-dev-qa-db-ja.com

スクリプトが「開始」を使用している場合でも、Maven execプラグインを使用してWindowsバッチスクリプトを起動すると、ビルドがブロックされます

カスタムコンテナーの上にあるアプリケーションのデプロイメントの統合テイスティングを実行しようとしています。私のコンテナーはカスタムなので、コンテナーのセットアップに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プラグインがスタックし、テストが実行されません。 バッチファイルをmy Java Application? から実行するにはどうすればよいですか)に従って、pom.xmlを次のように変更しました。

 <configuration>
                <executable>cmd</executable>
                <arguments>
                    <argument>/C</argument>
                    <argument>start</argument>
                    <argument>gs-agent.bat</argument>
                </arguments>
            </configuration>

しかし、これは問題を解決しないようです:

Maven halted

21
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プラグイン用のforkの言及とリンクがあります。

それ以外は、当分はantrunプラグインを使用する必要があると思います。

これは、実際の構成から取られ、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に設定します。

19
eis

私の場合、npmとngで問題が発生しました。根本的な問題はexec-maven-pluginはshスクリプト(拡張機能なし)を実行しようとしました。

名前の変更

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

そして

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

問題を解決しました。

1
Anand Rockzz

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

0
Vsegar