maven assembly plugin 三种打包模式

Maven 插件使用

maven-assembly-plugin 篇



前言

随便说点

一直使用maven-assembly插件,没有对其做一个总结,这里简单记录一下assembly打包的三种方式,并没有对参数有更多的涉及,后期会持续进行跟进补充(欢迎评论区指正)


以下是本篇文章正文内容

一、maven-assembly插件是什么?

相同类型的插件对比

插件功能
maven-jar-plugin传统的打包方式,会在target下生成jar包文件
maven-dependency-plugin将一系列依赖artifacts打包到指定目录下
maven-assembly-plugin提供定制化打包的服务,分为single-project/multimodule-project/sharing-descriptor三种模式

二、Single Project(单项目模式)

Single Project Apache 官网说明
Single Project即所有操作都是在当前项目下完成的,不会涉及到别的项目。

1.项目目录

文件目录

2.POM文件

POM内容

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <!--here is the sample of single project-->
                    <execution>
                        <id>assem-single-dist</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>${basedir}/src/assembly/filter.properties</filter>
                            </filters>
                            <descriptors>
                                <descriptor>${basedir}/src/assembly/single-dist.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

这里表示的是maven-assembly插件会在prepare-package阶段(maven phase生命周期 后期会写文章分享学习心得)执行goal:single。具体行为为读取src/assembly/single-dist.xml下的内容进行文件的相关操作,并且通过src/assembly/filter.properties的规则对部分文件内容进行替换

3.single-dist.xml

XML内容

<assembly>
    <id>single-distro</id>
    <formats>
        <format>jar</format>
    </formats>
    <files>
        <file>
            <source>README.txt</source>
            <outputDirectory></outputDirectory>
            <filtered>true</filtered>
        </file>
    </files>
</assembly>

该xml描述了对当前项目下的文件做何种转移操作,这里只是简单的将项目目录下的README文件打包到项目target目录下,<formats>表示文件打包的格式,当前是打包成jar,<filtered>决定是否进行内容替换,这里的内容替换文件为src/assembly/filter.properties

4.filter.properties

内容替换

username=admin
password=12345

原先README的文件内容:

${username}
${password}

替换后Target目录生成的README文件内容:

admin
12345

filter.properties文件采用 ‘变量=替换的值’形式,对<filtered>为true的文件进行占位符替换操作。

5.生成文件演示

在这里插入图片描述
在这里插入图片描述


三、Sharing Descriptor(分享 文件操作)

Sharing Descriptor 官网说明
Single Project 的 descriptor是在当前项目下的,比较规范的操作是,把所有的descriptor放在特定的项目下,并在别的项目中进行descriptor的引用,这样文件操作和项目内容就可以解耦。比如apache-hadoop项目,就单独开了一个assemblies,里面都是对项目文件的操作xml。
在这里插入图片描述

1.Descriptor存放位置(单独项目)

Project:assembly-sharing-descriptor

在这里插入图片描述
如果想在其他项目中进行descriptor的引用,必须将该descriptor存放在/src/main/resources/assemblies下,并且在其他项目的plugin-dependency中进行引用(否则无法找到)

2.需要获取Descriptor的项目

Project:assembly-sharing [注意区分]
POM文件

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <!--if you want to use sharing mode, you must add plugin dependencies here-->
        <dependencies>
          <dependency>
            <groupId>com.laozhaer</groupId>
            <artifactId>assembly-sharing-descriptor</artifactId>
            <version>${project.version}</version>
          </dependency>
        </dependencies>
        <executions>
          <!--here is the sample of sharing descriptor-->
          <execution>
            <id>assem-sharing-dist</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <appendAssemblyId>false</appendAssemblyId>
              <attach>false</attach>
              <finalName>${project.artifactId}-${project.version}</finalName>
              <descriptorRefs>
                <descriptorRef>sharing-dist</descriptorRef>
              </descriptorRefs>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

descriptorRef即需要搜索的xml名字,具体搜索位置为artifact:assembly-sharing-descriptor。
这里的最后生成打包就不在进行演示(效果和第一种模式一样)


四、Multi-Module Project(多module打包模式)

Multi-Module 官网说明
multi-module打包模式主要是为了在父项目下获取子项目的module对应binary文件(可能是多级module)并打包。

1.目录结构

在这里插入图片描述
这里需要注意的是,我们想在assembly-multimodule下进行assembly-child2的binary文件获取,若将assembly-child1的parent设置成assembly-multimodule,则会因为maven的打包顺序打包失败,因为父项目打包时,子项目的binary并没有生成。
Please ensure the package phase is run before the assembly is generated.
所以建了一个空项目assembly-multimodule-pre,并且将子项目的pom文件都指向这个空项目,在maven打包时,assembly-multimodule-pre先于assembly-multimodule完成。
在这里插入图片描述

当执行到assembly-multimodule时,子项的binary已经打包完成,便可执行assembly。

2.multimodule-dist.xml

采用了第二种模式,也存放在Project:assembly-sharing-descriptor

在这里插入图片描述

XML内容

<assembly>
    <id>multi-module-distro</id>
    <formats>
        <format>zip</format>
    </formats>

    <moduleSets>
        <moduleSet>
            <includes>
                <include>com.laozhaer:assembly-child2</include>
            </includes>
            <binaries>
                <outputDirectory>assem-module</outputDirectory>
                <unpack>false</unpack>
            </binaries>
        </moduleSet>
    </moduleSets>
</assembly>

3.相关补充

Assembly的文件操作形式有三种,分别为FileSet,ModuleSet和DependencySet
因为这里介绍的是打包形式,module打包比较特殊,所以只介绍了moduleSet的相关用法ModuleSet
当前操作为,在assembly-multimodule项目的target目录下生成包含com.laozhaer:assembly-child2这个module的zip文件。

assembly-multimodule POM文件

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>com.laozhaer</groupId>
                        <artifactId>assembly-sharing-descriptor</artifactId>
                        <version>${project.version}</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>multi-dist</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <appendAssemblyId>false</appendAssemblyId>
                            <attach>false</attach>
                            <finalName>${project.artifactId}-${project.version}</finalName>
                            <descriptorRefs>
                                <descriptorRef>multimodule-dist</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

4.生成文件演示

在这里插入图片描述
在这里插入图片描述


总结

简单记录了一下assembly的使用形式,如果大家还有问题欢迎在评论区留言。
具体的代码:资源链接
后续会更新更多maven实用插件的使用。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Maven-assembly-plugin是一个用于打包的插件,可以将项目中的多个模块合并成一个可执行的JAR包或者WAR包。然而,有时候我们可能需要对已经打包好的JAR或者WAR包进行进一步的处理或者外部打包。以下是关于maven-assembly-plugin外部打包的解答。 首先,我们需要确保已经正确配置了maven-assembly-plugin,并且在项目的pom.xml文件中已经定义好了自定义的assembly描述文件(assembly.xml)。 在进行外部打包之前,我们需要先将项目进行构建和打包。在项目根目录下通过命令行输入"mvn clean install"命令来构建项目,并且将项目打包成JAR或者WAR文件。 接下来,在项目根目录下创建一个新的文件夹(例如,external_package),用于存放外部打包的文件。 然后,可以通过以下命令来进行外部打包: mvn assembly:assembly -Ddescriptor=assembly.xml -DoutputDirectory=/path/to/external_package 在上面的命令中,-Ddescriptor参数用于指定assembly描述文件所在的路径以及文件名称,-DoutputDirectory参数用于指定外部打包文件存放的路径。 执行完上述命令后,maven-assembly-plugin会根据assembly.xml文件的定义,在指定的路径下生成外部打包文件。 通过以上步骤,我们就可以实现maven-assembly-plugin的外部打包功能。需要注意的是,我们在进行外部打包之前,需要先正确配置和打包项目,并且确保已经定义了正确的assembly描述文件。 外部打包可以用于将项目的可执行文件(如JAR或者WAR文件)与其它资源(如配置文件或者依赖库)合并打包成一个单独的压缩文件,方便部署和分发。它可以帮助我们将项目打包成一个易于使用和发布的形式,简化部署流程,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值