web-dev-qa-db-ja.com

Mavenを使用して実行可能なjarを実行する良い方法はありますか?

マルチモジュールの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には組み込みの突堤サーバーが含まれています。 execの動作方法(mavenと同じJVMを使用しないため)のため、プロセスを手動で強制終了しない限りサーバーは終了しません。これも同様に面倒です。

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

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

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

17
Shaun

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プラグインをこれらのフェーズにバインドする代わりに、maven antrunプラグインをバインドして任意のコマンドを実行できます。

28
user1050755

ものを実行したい場合は、maven antまたはgmaven(その後、groovy ant builderを使用)を使用します

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

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

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

3
Adam Gent