1

これは簡単だと思いましたが、問題があります:

  • Project1 のタイプは war です。これにより、一部の Apache モジュール (solr/lucene) と一部のカスタム コードを含む webapp .war ファイル全体が作成されます。
  • Project2 は既存のアプリケーションです。Project1 の war ファイルに対してクエリを実行するには、組み込みの Jetty を起動する必要があります。(以下のコードを参照)

主な問題:

  • Project2 が Jetty をインスタンス化するとき、WAR ファイルへのフル パスを渡す必要がありますが、これは毎回変更されます。Maven は Project1 の war ファイルにバージョン番号を追加します。

レスキューへのアセンブリ?

  • カスタム アセンブリを機能させることはできますが、Project1 からバージョン管理スタンプを取り除くことができません。

しかし、私はいつも Project1-1.4.1-20120530.233546-2.war で終わります。もっと便利な場所にありますが、名前はまだ変です。

Project2 の Jetty コード:

    // Context
    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    String jettyHome = System.getProperty( "jetty.home", ".." );
    String fullWarName = ...;    // Project1's WAR file. This path always changes
    webapp.setWar( fullWarName );
    // Server
    Server server = new Server( kPort ); // TODO: get from config
    server.setHandler(webapp);
    server.start();
    server.join();

その他の考慮事項:

  • maven-jetty プラグインがあることは認識していますが、ここでは適切ではないと思います。単体テストを対象としているようです。また、アプリケーション スタックは実行時に Maven を使用してサービスを起動しません。
  • また、Solr には Web コンテナーを必要としない完全に組み込まれたバージョンがあることも認識していますが、これはしばらく非推奨であり、使用するのはお勧めできません。

このプロジェクトをリファクタリングするより良い方法はありますか? 多分これは「メイヴン・ウェイ」ではないでしょうか?

4

1 に答える 1

1

アセンブリは必要なかったことがわかりました (内部で得たアドバイス)。代わりに、メインの pom にもっと簡単なものがあります。また、ここで戦争を展開するのは良いアイデアであることが判明しました。

Project1 の pom.xml の上部に次のものがあります。

 <groupId>com.my.group</groupId>
 <artifactId>project-one</artifactId>
 <version>1.2.3-SNAPSHOT</version>
 <packaging>war</packaging>

これは、Project2 の pom.xml の下部近くにあります。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>unpack-webapp</id>
      <phase>package</phase>
      <goals>
        <goal>unpack</goal>
      </goals>
      <configuration>
          <artifactItems>
           <artifactItem>
            <groupId>com.my.group</groupId>
            <artifactId>project-one</artifactId>
            <version>1.2.3-SNAPSHOT</version>
            <type>war</type>
            <overWrite>true</overWrite>
            <outputDirectory>${project.build.directory}/webapps/project-one</outputDirectory>
           </artifactItem>
         </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>

次に、Jetty を起動すると、次のようになります。

webapp.setWar( "target/webapps/project-one" );

一部の Jetty 設定に問題がある可能性はまだあると思いますが、これは正しい方向だと思います。

于 2012-06-07T19:52:36.430 に答える