13

すべてのモジュールとその依存関係を含むマルチモジュール maven プロジェクトの uber jar を作成する必要があるシナリオがあります。maven shadeプラグインを使ってみました。しかし、モジュールレベルで使用した場合にのみ機能するようです。親 pom にプラグイン エントリを追加すると、ビルドが中断します (親 pom をシェーディングしようとします)。

 [INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing null with C:\Projects\foo.bar\target\foobar-0.0.1-SNAPSHOT-shaded.pom
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error creating shaded jar: null: NullPointerException -> [Help 1]

<packaging>親mavenプロジェクトのはpomであるため、それは理にかなっているようです。しかし、マルチモジュールプロジェクト用のuber jarを作成する方法がいくつかあるはずです...何かアイデアはありますか???

4

3 に答える 3

13

親プロジェクトの POM ファイルを使用してシェーディングを試みるべきではありません。これには別のアグリゲーター プロジェクトを使用する必要があります。親 Maven プロジェクトは継承に使用され、アグリゲーター プロジェクトはサブプロジェクトのグループに対して集計関数を実行するために使用されます。JAR を一緒に uber jar にシェーディングするようなものです。このプロジェクトは、プロジェクトのルート ディレクトリ (すべてのサブモジュールのフォルダーと同じレベル) にある pom ファイルであり、サブプロジェクトを参照し、shade プラグイン構成を持っています。この pom に指定されたパッケージが JAR であることを確認してください。

これは、POM の関係と、集約と継承の違いを説明するドキュメントです。

于 2010-07-05T19:09:33.780 に答える
4

はい !あなたはできる !:-)

Shadeには実装上の問題があります。pom(jarまたはwebではない)プロジェクトで実行されているのはいつかわかりません。Pomプロジェクトはバイナリアーティファクトを生成しないため、shadeはマージ、移動などするファイルを検出せず、NPEをスローします。

この問題を解決するには、aggegate-Pomプロジェクトから親POMを作成します。その中に、シェードの定義と構成の構成をいくつかのプロファイル(alwaysActiveProfilesなど)に配置し、次のコマンドを使用してインストール/デプロイします。

mvn deploy -P -alwaysActiveProfiles

このコマンドは、shadeプラグインpomを実行せずにこのシェーディングされた親をインストールし(-alwaysActiveProfilesオプションはシェードプラグインの実行を抑制します)、その後、Mavenに依存するプロジェクトが機能します。影付きの親pomは次のようになります。

<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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>xxxxxxxx</groupId>
<artifactId>web-pom</artifactId>
<name>web-pom</name>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            ...
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
<dependencies>
    ...
</dependencies>

<profiles>
    <profile>
        <id>alwaysActiveProfiles</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

settings.xmlではデフォルトでalwaysActiveProfilesが有効になっている必要があることに注意してください。有効にしないと、依存関係のshade-pomプロジェクトでshadeが実行されません。

于 2011-01-04T19:52:10.653 に答える