17

マルチモジュールのMavenプロジェクトがあり、モジュールの1つは配布用です。

Project \
| moduleA \
| moduleB \
| ...
| dist-module \

ディストリビューションには、簡単に実行したい実行可能jarが含まれています。ただし、それを実行するには、次のように入力する必要があります。

java -jar dist-module/target/dist-module-1.0-SNAPSHOT-full-dist/myJar.jar

単純に次のように入力することをお勧めします。

mvn exec:java \ OR
mvn exec:exec

残念ながら、Javaの目標を取得して.jarを実行する方法が見つかりません。execの目標は実際にそれを行いますが、落とし穴があります。jarには組み込みのjettyサーバーが含まれており、execの動作方法(mavenと同じJVMを使用しない)により、プロセスを強制終了しない限りサーバーは終了しません。手動で、これも同様に面倒です。

Mavenを使用してこれを行う方法に関する推奨事項はありますか?

編集:
明確にするために、このコマンドは主に単純な手動スモークテストに使用されます。ログ出力を読み取り、プログラムが配布環境で正しく起動したことを確認します。そのため、サーバーとMavenの両方を終了するctrl-cを使用したブロッキング呼び出しである可能性があります。

組み込みサーバーは、いくつかの特定のアプリケーションを実行するために特化されており、それらを自動的に再ロードしません。したがって、サーバーをMavenから独立して長期間実行し続ける必要はあまりありません。

4

2 に答える 2

29

mvn exec:javaは、target /の下のコンパイラ出力から直接アプリを実行します-jarから実行する必要はありません:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
            <execution>
                <id>default-cli</id>
                <goals>
                    <goal>java</goal>
                </goals>
                <configuration>
                    <mainClass>uk.co.pookey.hibernate.App</mainClass>
                    <systemProperties>
                        <systemProperty>
                            <key>derby.stream.error.file</key>
                            <value>${basedir}/target/derby.log</value>
                        </systemProperty>
                    </systemProperties>
                </configuration>
            </execution>
        </executions>
    </plugin>            

mvn exec:execを使用してjarを実行する場合:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
            <execution>
                <id>default-cli</id>
                <goals>
                    <goal>exec</goal>
                </goals>
                <configuration>
                    <executable>java</executable>
                    <!-- optional -->
                    <workingDirectory>/tmp</workingDirectory>
                    <arguments>
                        <argument>-jar</argument>
                        <argument>${basedir}/target/hibernate-derby-memory-${project.version}.jar</argument>
                    </arguments>
                </configuration>                        
            </execution>
        </executions>
    </plugin>         

突堤の終了に問題がある場合は、統合テストを実行することをお勧めします(または、最初に突堤を終了せずに突堤のメインスレッドを終了しないか、突堤の停止ポートを使用します)。JVMをバックグラウンドで実行し、テスト後にMavenに再度停止させることができます。これには、統合前テスト、統合テスト、または統合後テストの3つのフェーズがあります。これについて詳しくは、 http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testingをご覧ください。jetty mavenプラグインを使用する場合、pom.xml構成は次のようになります。

   <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <!-- test start/stop: -->
        <executions>                
            <execution>
                <id>start-jetty</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>deploy-war</goal>
                </goals>
                <configuration>
                    <daemon>true</daemon>
                    <systemProperties>
                        <systemProperty>
                            <name>some.prop</name>
                            <value>false</value>
                        </systemProperty>
                    </systemProperties>
                </configuration>
            </execution>
            <execution>
                <id>stop-jetty</id>
                <phase>post-integration-test</phase>
                <goals>
                    <goal>stop</goal>
                </goals>
            </execution>
        </executions>    
    </plugin>

jetty mavenプラグインをこれらのフェーズにバインドする代わりに、mavenantrunプラグインをバインドして任意のコマンドを実行できます。

于 2013-03-07T22:03:53.447 に答える
3

何かを実行したい場合は、maven antまたはgmavenを使用します(次にgroovy ant builderを使用します)

編集後は、 DropWizardのようなものを使用しているように聞こえます。彼らがその問題をどのように解決しているかを見たいと思うかもしれません。

コメントに基づいて編集:

Spring Boot Mavenは、実行可能なwarを作成するだけでなく、それらを実行します。SpringBootもSpringも必要ありません。ここでの私の答えの詳細:spring-boot-maven-pluginは非春のプロジェクトに使用できますか?

于 2013-03-01T01:00:11.523 に答える