同じgroupIdに基づくサブモジュールのみを含むuberjarを作成するためのMavenShadeプラグイン構成

Aug 19 2020

次の状況にある:

  • STS
  • Java
  • Maven

マシンワン

ワークスペース-01

Mavenを使用するJavaアプリは、単一のモジュールに基づいています。mvn installリポジトリにインストール()され、master-project.jar他のマシンのファイルがインストールされ、他のプロジェクトに使用されます。

<dependency>
  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1.SNAPSHOT</version>
</dependency>

ここまではすべて正常に機能します

ワークスペース-02

アプリは成長し、他のワークスペースでは、マルチモジュールで動作するようにアプリが移行されました

簡単にするために次の構造を想定しましょう

master-project (<packaging>pom</packaging>)
alpha (<packaging>jar</packaging>)
beta (<packaging>jar</packaging>)
numbers (<packaging>pom</packaging>)
   one (<packaging>jar</packaging>)
   two (<packaging>jar</packaging>)
countries (<packaging>pom</packaging>)
   Europe (<packaging>pom</packaging>)
      France (<packaging>jar</packaging>)
      Italy (<packaging>jar</packaging>)
   AmericaLatina (<packaging>pom</packaging>)
      Peru (<packaging>jar</packaging>)
      Argentina (<packaging>jar</packaging>)

これらすべてのモジュールをコンパイルすることができます。したがって、成功を築く

ゴール

ここでの目標は、master-project.jar内部jarのサブモジュールを含む同じファイルを生成することです。

調査を行った後の解決策は次のとおりです。 maven-shade-plugin

  • maven-shade-pluginは何に使用され、なぜJavaパッケージを再配置したいのですか?

次のリンクやその他のソースを参照する方法を使用して、次の構成(その一部)があります。

  • Mavenマルチモジュールパッケージで集約としてJARファイルを作成します

したがって:

  <modelVersion>4.0.0</modelVersion>
  <packaging>pom</packaging>  <--- it is the main or root pom.xml file

  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    ....
  </properties>

  <dependencies>
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-all</artifactId>
        <version>${hazelcast.version}</version>
        <scope>provided</scope> <!-- Otherwise each uber jar within each submodule is 11.6MB -->
    </dependency>
  </dependencies>

  <modules>
    <module>...</module>
    ...
  </modules>

  <build>
    <plugins>
      ....
      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <id>create-fat-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <includes>
                                <include>com.manuel.jordan</include>
                            </includes>
                        </artifactSet>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

現在の構成では、次のことが起こります。

targetディレクトリ内のモジュールごとに:

  • With<packaging>pom</packaging>.pomファイルを生成します
  • withは、サブモジュール自体とuber jarの<packaging>jar</packaging>2つの.jarファイルを生成します(モジュールごとにはい)

目標:次のようなものを生成するための追加または欠落している構成は何ですか?

master-project.jar containing
 module1.jar
 module2.jar
 ...
 module3.jar

それぞれmodule#が同じ<groupId>com.manuel.jordan</groupId>宣言をしている場合、それが私が宣言した理由です

<configuration>
   <artifactSet>
      <includes>
         <include>com.manuel.jordan</include>
      </includes>
   </artifactSet>
</configuration>

そして、ルート/メインpom.xmlファイルが持っていることを確認してください<packaging>pom</packaging>

ゴール

したがって、目標は、他のマシンにある他のプロジェクトが平和を保つことです。

<dependency>
  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1.SNAPSHOT</version>
</dependency>

したがって、master-projectプロジェクトがシングルモジュールであるマルチモジュールであるかは関係ありません。

回答

1 CésarAlves Sep 21 2020 at 23:43

他のモジュールへの依存関係を使用して、マスタープロジェクトの下にパッケージングjarモジュールを作成し、そこにのみシェードプラグイン構成を含めることができます。