9

状況はかなり単純です。Mavenで構築するために変換しているJava Webアプリケーションがあります。現在、アプリは Ant を使用して 1 つの WAR ファイルにビルドされ、非常に単純な application.xml を使用して EAR にバンドルされます。

maven-war-pluginどちらも私にmaven-ear-pluginは非常に簡単に見えます.WARプロジェクトはEARプロジェクトの依存関係として、上記を2つの異なるプロジェクトと見なすことを余儀なくされているようです. 特にWARプロジェクトのプロファイル設定は環境ごとに変わるため、これは少し不便に思えます.EARをビルドしようとするたびに、ビルドの微調整を繰り返さなければならないようです.

つまり、WAR を構築し、それをこの単純な EAR にパッケージ化する簡単な方法はありますか? これらを 2 つの別々のプロジェクトとして維持することは避けたいと思いますが、同様に、これを達成するためにアセンブリを使用する過度に厄介なハックに頼りたくありません。

4

3 に答える 3

17

つまり、WARを構築し、それをこの非常に単純なEARにパッケージ化する簡単な方法はありますか?これらを2つの別個のプロジェクトとして維持することは避けたいのですが、同様に、これを実現するためにアセンブリを使用して過度に厄介なハックに頼ることは避けたいと思います。

簡単な答え:いいえ、これを行うための簡単なMavenの方法はありません。これは、「プロジェクトごとに1つのアーティファクト」であるMavenルールに反するためです(99%の場合に当てはまるプロジェクトごとに1つの出力を理解してください)。

そして実際には、ハッキーな方法をとらず、アセンブリを使用してEARを作成することを忘れることを強くお勧めします。代わりに、2つのモジュールを作成します。1つはタイプのパッケージで、もう1つは戦争アーティファクトに応じたwarタイプのパッケージで、それらを親のモジュールとして宣言します。このような:earpom.xml

my-project
|-- pom.xml       // packaging of type pom and my-war and my-ear as modules
|-- my-war
|   `-- pom.xml   // packaging of type war
`-- my-ear
    `-- pom.xml   // packaging of type ear

Mavenを選択し、Mavenの哲学を採用し、それと戦わないでください。多くの苦痛を軽減できます。真剣に、maven-ear-pluginがすでに実行していることを実行するためにアセンブリをハッキングすることは、単なるアンチDRYです。その場合はAntに固執したほうがいいです。

于 2009-12-08T22:21:14.893 に答える
3

これはもう5年経っていますが、検索したときに出てきた最初の答えでした. また、「それはMavenの方法ではない」というのは一部の人にとっては完全に合理的な答えですが、OPが尋ねたように単一のpomを使用することを好む人もいるかもしれません。実際にはそれほど複雑ではありません.

まず、標準の war pom.xml を作成して、ear に含める war ファイルを生成します。梱包は戦争のまま。

次に、war ファイル名のプレースホルダーを使用して、独自の application.xml を (src/main/application または任意の場所に) 記述します。

<application xmlns="http://java.sun.com/xml/ns/javaee" ... >
  <module>
    <web>
      <web-uri>${project.build.finalName}.war</web-uri>
      <context-root>myapp</context-root>
    </web>
  </module>
</application>

また、他のサーバー固有の xml ファイル (weblogic-application.xml など) を同じ場所に含めます。

次に、リソース セクションを追加して、プレースホルダーを war ファイル名に置き換えます。

<resources>
  <resource>
    <directory>src/main/application</directory>
    <filtering>true</filtering>
    <includes>
      <include>META-INF/*.xml</include>
    </includes>
  </resource>
</resources>

最後に、ant ear タスクを追加して耳を作成します。

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <ear destfile="${project.build.directory}/${project.build.finalName}.ear"
               appxml="${project.build.outputDirectory}/META-INF/application.xml">
            <fileset dir="${project.build.outputDirectory}" includes="META-INF/*.xml"/>
            <fileset dir="${project.build.directory}" includes="${project.build.finalName}.war"/>
          </ear>
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

以上です。

于 2014-06-20T08:40:39.810 に答える
2

Maven では、すべてのプロジェクトが成果物を生成します。あなたの状況では、戦争用と耳用の 2 つのプロジェクトを作成することをお勧めします。プロジェクトの複数のバージョンが必要な場合は、分類子とプロファイルを使用して達成できます。

これは、richfaces のサンプル pom の抜粋です。

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <executions>
          <execution>
            <id>jee5</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-jee5</webappDirectory>
              <classifier>jee5</classifier>
              <packagingExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
          <execution>
            <id>tomcat6</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-tomcat6</webappDirectory>
              <classifier>tomcat6</classifier>
              <packagingExcludes>WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <webResources>
            <resource>
              <directory>${basedir}/src/main/java</directory>
              <targetPath>/WEB-INF/src</targetPath>
            </resource>
          </webResources>
        </configuration>
      </plugin>

あなたの耳でプロファイルを使用して、適切な分類子で必要な依存関係をインポートします。

<profile>
  <id>jee5</id>
  <dependencies>
     <dependency>
       <groupId>org.richfaces.samples</groupId>
       <artifactId>richfaces-demo</artifactId>
       <version>${richfaces-version}</version>
       <classifier>jee5</classifier>
       <type>war</type>
       <scope>runtime</scope>
     </dependency>
  </dependencies>
</profile>   
于 2009-12-08T22:31:49.333 に答える