Maven WARプロジェクトを2つのモジュールに分割して、コマンドラインツールを使用して個別のJARファイルを作成できるようにしようとしています。結果の構造は次のとおりです。
pom.xml
(パッケージ化pom
、2つのモジュールがあります)project-jar/
pom.xml
(パッケージングjar
)project-war/
pom.xml
(パッケージ化war
、project-jar
に依存)ルートからmvn
コマンドを実行すると、すべて正常に機能します。 mvn jetty:run
を使い続けたいのですが、そのためにはWARサブプロジェクトでコマンドを実行する必要があります。そうすると、project-jar
サブプロジェクトが見つからないため、実行されません。 target
ディレクトリに完全にアセンブルされたWARファイルを持つmvn jetty:run-war
でさえ、最初にプロジェクトを「ビルド」しようとするため、失敗します。 project-jar
をローカルのMavenリポジトリにインストールすることによってのみ機能させることができましたが、これはあまり良いことではありません。
マルチモジュールのMaven構成でJettyプラグインを使用する方法はありますか?
魔法の解決策はありません。私が知っている唯一の解決策は少しハッキーで、比較的余分なクラスディレクトリを宣言するために使用できるextraClasspath
要素に依存しています。このように( JETTY-662 から):
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.0.1.v20091125</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webAppConfig>
<contextPath>/my-context</contextPath>
<extraClasspath>target/classes;../my-jar-dependency/target/classes</extraClasspath>
</webAppConfig>
<scanTargets>
<scanTarget>../my-jar-dependency/target/classes</scanTarget>
</scanTargets>
</configuration>
</plugin>
戦争モジュール内にプロファイルを作成します(project-war
)。このプロファイル内で、ライフサイクルフェーズにアタッチし、run
ゴールを明示的に実行するようにjettyを構成します。これで、mavenがそのプロファイルを有効にしてトップレベルプロジェクトから実行されると、jetty:runが呼び出され、姉妹モジュールの依存関係が解決されます(トップレベルプロジェクトからmavenコマンドを実行する場合は通常どおり)。
Webモジュールのpom.xmlに配置された場合の構成例(project-war
)、test
フェーズ中にjetty:runを実行するように調整します。 (別のフェーズを選択することもできますが、それがcompile
の後にあることを確認してください。)
トップレベルから実行:mvn test -Pjetty-run
またはmvn test -DskipTests=true -Pjetty-run
。これにより、必要に応じて依存関係がコンパイルされ、使用可能になりますが、正しいモジュール内でjetty:runが呼び出されます。
<profiles>
...
<!-- With this profile, jetty will run during the "test" phase -->
<profile>
<id>jetty-run</id>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.1.6.v20100715</version>
<configuration>
...
<webAppSourceDirectory>
${project.build.directory}/${project.build.finalName}
</webAppSourceDirectory>
...
</configuration>
<executions>
<execution>
<id>jetty-run</id>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
...
</profiles>
桟橋構成でextraClasspathを使用すると機能します...しかし、何らかの理由で、(他のモジュールからの)依存jarが古くなっていると、正しく機能しないものがあります。
桟橋プラグインをルートpomに追加し、目的の戦争を指すcontextHandlerを構成します。これは、複数のjarモジュールと2つのオーバーレイ戦争があるプロジェクトで機能します。
<plugin>
<groupId>org.Eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.0.M2</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextHandlers>
<contextHandler
implementation="org.Eclipse.jetty.maven.plugin.JettyWebAppContext">
<war>${project.basedir}/project-war/target/project-war-${project.version}.war</war>
<contextPath>/</contextPath>
</contextHandler>
</contextHandlers>
</configuration>
</plugin>
http://Eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#running-more-than-one-webapp
プラグインの構成を求めていることは知っていますが、mavenコマンドでプロジェクトを定義するだけで済みます。
$ mvn jetty:run --projects project-war