Maven2をには、WARおよび単一POMでそのWARを格納するためのEARを構築するための最も簡単な方法は何ですか?
-
18-09-2019 - |
質問
状況は非常に簡単です。私はMavenので構築されるように変換していたJava Webアプリケーションを持っています。現在のところ、アプリはその後、非常にシンプルなのapplication.xmlをEARにバンドルされている単一のWARファイルへのAntで構築されています。
maven-war-plugin
とmaven-ear-plugin
の両方が私にはかなり簡単になり、彼らが私を設定しているEARプロジェクトの依存関係としてWARプロジェクトで、二つの異なるプロジェクトとして上記を考慮することを余儀なくされているようです。これは、WARプロジェクトのプロファイル設定が、それは私もEARを構築しようとするたびに微調整そのビルドを複製するために私を強制するように思える各環境用に変更されます、特にので、少し不便なようです。
すべてのことと言って:この自明-シンプルなEARにWARおよびパッケージ構築するための簡単な方法がありますか?私は2つの別々のプロジェクトとしてこれらを維持避けたいのですが、同様にこれを達成するためのアセンブリを使用して、過度に厄介なハックに頼るしたくない。
解決
すべてのことと言って:この自明-シンプルなEARにWARおよびパッケージ構築するための簡単な方法がありますか?私は2つの別々のプロジェクトとしてこれらを維持避けたいのですが、同様にこれを達成するためのアセンブリを使用して、過度に厄介なハックに頼るしたくない。
短い答え:いいえ、本当ですこれは、「プロジェクトごとに1つの案件が」Mavenの規則に反するとして、(プロジェクトごとに1つの出力を理解していることを行うには簡単なのmaven-方法はありません例99%で)。
そして実際に、私は強くへの推薦のありませんのハックの道を行くとEARを作成するためのアセンブリを使用して忘れてしまいました。代わりに、戦争の成果物に依存型war
のパッケージに2つのモジュール型ear
のパッケージで1、その他を作成し、親pom.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の耳 - プラグインがすでにやっているやってアセンブリをハッキングすることは、単に抗DRYです。あなたはより良い、その場合にはAntのに固執すると思います。
他のヒント
私は、これは今5歳ですけど、それはまだ私が検索時に思いついた最初の答えでした。 「それは、Mavenの方法ではない」ながらも、一部の人のための完全に合理的な答えは、他の人はまだ、OPが尋ねたように、単一のPOMを使用することを好むことであり、それは本当に複雑ではありません。
まず、あなたが耳に含めるwarファイルを生成するための標準的な戦争のpom.xmlを作成します。戦争などの包装のままにしておきます。
そして、戦争のファイル名のプレースホルダを使用して(SRC /メイン/アプリケーションまたはどこで)あなた自身のapplication.xmlを書きます:
<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>
最後に、構築された耳にアリ耳のタスクを追加します:
<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>
そして、それはそれだ。
Mavenのでは一つ一つのプロジェクトがaritifactを生産します。あなたの状況では、私は2つのプロジェクト戦争のための1と耳のための1つを作成することをおすすめします。あなたのプロジェクトのmutltipleのバージョンが必要な場合には、分類とプロファイルを使用していることachiveすることができます。
これは例がポンポンたRichFacesの抜粋です。
<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>