Maven Shade插件配置可创建仅包含基于同一groupId

时间:2020-08-18 17:57:27

标签: java maven maven-3 maven-shade-plugin

具有以下情况:

  • STS
  • Java
  • 行家

机器一号

workspace-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>

直到这里一切正常

workspace-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

我具有以下配置(部分配置),使用以下链接和其他来源的方式进行引用:

因此:

  <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>

并观察到根{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项目是 single 还是 multi-module

1 个答案:

答案 0 :(得分:1)

您可以在主项目下创建一个与其他模块相关的包装jar模块,并仅在其中包含shade插件配置