web-dev-qa-db-ja.com

マルチモジュールMavenプロジェクトとjetty:run

Maven WARプロジェクトを2つのモジュールに分割して、コマンドラインツールを使用して個別のJARファイルを作成できるようにしようとしています。結果の構造は次のとおりです。

  • pom.xml(パッケージ化pom、2つのモジュールがあります)
  • project-jar/
    • pom.xml(パッケージングjar
  • project-war/
    • pom.xml(パッケージ化warproject-jarに依存)

ルートからmvnコマンドを実行すると、すべて正常に機能します。 mvn jetty:runを使い続けたいのですが、そのためにはWARサブプロジェクトでコマンドを実行する必要があります。そうすると、project-jarサブプロジェクトが見つからないため、実行されません。 targetディレクトリに完全にアセンブルされたWARファイルを持つmvn jetty:run-warでさえ、最初にプロジェクトを「ビルド」しようとするため、失敗します。 project-jarをローカルのMavenリポジトリにインストールすることによってのみ機能させることができましたが、これはあまり良いことではありません。

マルチモジュールのMaven構成でJettyプラグインを使用する方法はありますか?

36

魔法の解決策はありません。私が知っている唯一の解決策は少しハッキーで、比較的余分なクラスディレクトリを宣言するために使用できる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>
11
Pascal Thivent

戦争モジュール内にプロファイルを作成します(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>
29
Patrick

桟橋構成でextraClasspathを使用すると機能します...しかし、何らかの理由で、(他のモジュールからの)依存jarが古くなっていると、正しく機能しないものがあります。

1
Jaime Hablutzel

桟橋プラグインをルート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

1
Serge

プラグインの構成を求めていることは知っていますが、mavenコマンドでプロジェクトを定義するだけで済みます。

$ mvn jetty:run --projects project-war
0
Andrew Grover