Maven Shade 插件配置以创建仅包含基于相同 groupId 的子模块的 uber jar
Maven Shade plugin configuration to create uber jar containing just the submodules based in the same groupId
出现以下情况:
- STS
- Java
- 行家
机器一
工作区-01
带有 Maven 的 Java 应用程序基于 单个 模块。
它安装在 (mvn install
) 存储库中,其他机器中的 master-project.jar
文件安装并用于其他项目 how
<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
文件,包括内部 jars 的子模块。
经过研究,解决方案是:maven-shade-plugin
- What is the maven-shade-plugin used for, and why would you want to relocate Java packages?
我有以下配置(部分)使用如何参考以下链接和其他来源:
因此:
<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
目录中的每个模块:
- 用
<packaging>pom</packaging>
生成一个.pom
文件
- 使用
<packaging>jar</packaging>
生成两个 .jar
文件,一个是子模块本身,另一个是 uber 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>
并观察 root/main pom.xml
文件有 <packaging>pom</packaging>
目标
因此目标是位于另一台机器上的其他项目保持和平
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
因此,master-project
项目是单还是多模块
都没有关系
您可以在 master-project 下创建一个依赖于其他模块的打包 jar 模块,并且只在其中包含 shade 插件配置
出现以下情况:
- STS
- Java
- 行家
机器一
工作区-01
带有 Maven 的 Java 应用程序基于 单个 模块。
它安装在 (mvn install
) 存储库中,其他机器中的 master-project.jar
文件安装并用于其他项目 how
<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
文件,包括内部 jars 的子模块。
经过研究,解决方案是:maven-shade-plugin
- What is the maven-shade-plugin used for, and why would you want to relocate Java packages?
我有以下配置(部分)使用如何参考以下链接和其他来源:
因此:
<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
目录中的每个模块:
- 用
<packaging>pom</packaging>
生成一个.pom
文件 - 使用
<packaging>jar</packaging>
生成两个.jar
文件,一个是子模块本身,另一个是 uber 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>
并观察 root/main pom.xml
文件有 <packaging>pom</packaging>
目标
因此目标是位于另一台机器上的其他项目保持和平
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
因此,master-project
项目是单还是多模块
您可以在 master-project 下创建一个依赖于其他模块的打包 jar 模块,并且只在其中包含 shade 插件配置