24

多数の戦争で解決策があります。戦争は、休止状態と春を使用するという意味で似ています。これは、各戦争内に多数の同じ瓶があることを意味します。耳のサイズが不釣り合いに大きくなり始めているため、これが問題になっています。

Maven を使用して依存関係を計算し、複数の war に共通するすべての jar を EAR のルートに配置したいと考えています。

j2ee アーキタイプ (maven-archetype-j2ee-simple) を使用してプロジェクトを整理しようとしましたが、すべての戦争は依然として WEB-INF/lib 内の依存関係でパッケージ化されています。war または jar を構築するときにすべての移行依存関係を計算できるのと同じように、Maven に共通の依存関係を計算させて EAR に配置させる方法はありますか?

4

4 に答える 4

67

コメントで述べたように、すべての依存関係を計算するのは maven の仕事です。すべての一般的な依存関係を使用してアーティファクトを作成する場合、どの依存関係がそこに属しているかを推測する必要もあります。

すべての戦争依存関係を提供に設定すると、耳のない別のマシンへの依存関係を使用して、1 つの戦争を展開する必要がある可能性もあります。

スキニー戦争を取得する唯一の正しい方法は、例からです: http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

しかし、ここで興味深いのは、1 つ大きな問題があるということです。ショートカット (前述の痛みを完全に取り除きます) を使用して、WAR にどの依存関係があるかを maven に伝えます。

EAR-Module 内に移動し、すべての WAR 依存関係に対してタイプ pom を使用して、WAR に対する 2 番目の依存関係を宣言します。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.foo</groupId>
    <artifactId>skinny</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>ear</artifactId>
<packaging>ear</packaging>
<dependencies>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>war</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>war</type>
    </dependency>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>war</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.8</version>
            <configuration>
                <skinnyWars>true</skinnyWars>
                <defaultLibBundleDir>lib</defaultLibBundleDir>
                <modules>
                    <webModule>
                        <groupId>com.foo</groupId>
                        <artifactId>war</artifactId>
                    </webModule>
                </modules>
            </configuration>
        </plugin>
    </plugins>
</build>

これで、すべての WAR は独自の依存関係で個別にパッケージ化され、EAR は lib フォルダー内のスキニー WAR とすべての依存関係でパッケージ化されます。

アップデート:

JBoss EAP 6 のような厳密なコンテナー内のすべての依存関係 jar に ear/lib フォルダーを使用できるわけではないことに注意してください。 tomahawk、primefaces などの JSF コンポーネント ライブラリーは WEB-INF/lib フォルダーに存在する必要があります。

上記のソリューションでこれを実現する便利な方法は、次のように EARs pom.xml でコンポーネント ライブラリを除外することです。

...
<dependencies>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>war</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>war</type>
    </dependency>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>war</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <groupId>org.primefaces</groupId>
                <artifactId>primefaces</artifactId>
            <exclusion>
        </exclusions>
    </dependency>
</dependencies>
...

これで、WAR 内の WEB-INF/lib に配置されるコンポーネント ライブラリを除いて、WAR のすべての依存関係が ear/lib に配置されます。

于 2013-03-05T17:14:30.750 に答える
9

commons-jars という名前の新しいアーティファクトを作成し、pom としてパッケージ化します。使用しているすべての一般的な jar (Spring、Hibernate、Log4j など) に依存する必要があります。

次に、各戦争で、スコープが「提供」された依存関係として追加します(タイプをpomとして設定することを忘れないでください)。クラスパスでそれを見ることができますが、それらは war にパッケージ化されません。このようにして、スキニーウォーズのソリューションでは提供されない戦争固有の依存関係をパッケージ化することもできます。

于 2009-06-18T13:54:26.723 に答える
4

依存関係のスコープを「提供」に設定できます。これは、それらが他のモジュールによって提供され、最終的な jar または war に含まれないことを意味します。

おそらく、アセンブリ プラグインは、最終的な EAR をパッケージ化し、そこに共通の jar を配置するときに役立ちます。

于 2009-05-11T18:56:11.853 に答える
4

http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

于 2009-06-05T21:48:57.257 に答える