背景

maven默认的打包一般是将项目打成一个jar包,上传到服务器即可部署。但是如果涉及到多机器梯度部署、灰度部署就要一个服务器一个服务器的上传包,一个一个机器的部署,这样实在效率低下且麻烦。一般的操作是将批处理命令和项目打包好的jar包一起打包再分发到每个服务器,再通过多机批处理进行部署。

简介

Maven的Assembly插件是一个用于创建可部署分发包的插件,它允许您将项目构建输出的不同文件和资源组合成一个单独的分发包。这在构建可执行的JAR文件、WAR文件、ZIP文件或其他自定义分发包时非常有用。

优势

Maven的Assembly插件提供了许多好处,尤其是对于项目构建和分发方面的需求。以下是一些使用Maven的Assembly插件的好处:

  1. 定制化分发包:Assembly插件允许您根据项目的特定需求创建高度定制化的分发包。您可以选择包含哪些文件、目录和资源,以及如何组织它们。

  2. 多种输出格式:您可以使用Assembly插件创建各种不同格式的分发包,包括ZIP、JAR、TAR、WAR等。这使您可以适应不同平台和应用程序需求。

  3. 简化部署:通过创建预配置的分发包,您可以大大简化项目的部署过程。这有助于确保项目在不同环境中的一致性部署。

  4. 自定义文件和目录结构:Assembly插件允许您精确控制生成分发包的文件和目录结构。这对于创建自定义应用程序部署或发布文件结构非常有用。

  5. 版本管理:创建分发包时,您可以根据项目的版本号和其他属性来命名文件,这有助于有效的版本管理。

  6. 简化依赖管理:如果您的项目依赖于其他库或模块,Assembly插件可以帮助您将这些依赖包含在分发包中,从而简化了项目的依赖管理。

  7. 自定义构建脚本:您可以编写自定义构建脚本,以在创建分发包时执行特定任务。这使您可以在构建过程中自动化额外的步骤,例如生成文档或运行测试。

  8. 分离开发和生产配置:您可以创建多个不同的Assembly描述文件,以根据不同的配置需求生成不同的分发包。这有助于分离开发和生产配置。

  9. 自定义过滤和替换:您可以使用过滤器来在分发包生成过程中自动替换属性值,例如将配置文件中的占位符替换为环境特定的值。

总的来说,Maven的Assembly插件提供了一种强大的方式来管理和创建项目的分发包,帮助开发人员和团队在不同环境中有效地分发、部署和管理应用程序。这对于自动化构建和部署流程以及确保一致性非常有用。

用法、配置

  • 1. 添加Assembly插件到Maven项目

要在Maven项目中使用Assembly插件,需要在项目的pom.xml文件中添加插件配置。通常,插件配置应该放在build元素的内部。

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <!--构建的唯一id,可通过此id构建特定的分支-->
                    <id>assembly-master</id>
                    <!--绑定到maven操作类型上-->
                    <phase>package</phase>
                    <goals>
                        <!--运行一次-->
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptors>
                            <!--具体的配置文件-->
                            <descriptor>assembly-master.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
                <!--
                <execution>
                    <id>assembly-dev</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptors>
                            <descriptor>assembly-dev.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
                -->
            </executions>
        </plugin>
    </plugins>
</build>
  • 2. 创建Assembly描述文件

在项目中创建一个XML文件来定义如何构建分发包。这个XML文件通常被称为assembly.xml,可以位于项目的src/main/assembly/{多分支}目录下。您可以定义要包括的文件、目录、过滤器等。

如果存在上述POM文件中,多分支构建的场景,请按多分支创建不同的XML配置文件,如以下: assembly-master.xml

示例assembly-master.xml文件:

<assembly>
    <id>bin</id>
    <!-- 打包的类型,如果有N个,将会打N个类型的包 -->
    <formats>
        <!--<format>tar.gz</format>-->
        <format>tar.gz</format>
    </formats>
    <!--指定打包是否有分发包的最外层,如果不写,默认true-->
    <includeBaseDirectory>true</includeBaseDirectory>
    <!--文件设置-->
    <fileSets>
        <!--
            0755->即用户具有读/写/执行权限,组用户和其它用户具有读写权限;
            0644->即用户具有读写权限,组用户和其它用户具有只读权限;
        -->
        <!-- 将src/main/bin目录下的所有文件输出到打包后的bin目录中 -->
        <!--需要包含的文件与输出的路径-->
        <fileSet>
            <!--指明要对src/main/assembly/bin文件夹操作-->
            <directory>${basedir}/src/main/assembly/master</directory>
            <!--指明经过assembly插件打包后bin目录会放置在项目根目录下-->
            <outputDirectory>bin</outputDirectory>
            <!--指明bin目录下所有文件的权限为755-->
            <fileMode>0755</fileMode>
            <includes>
                <include>**.sh</include>
                <include>**.bat</include>
            </includes>
            <filtered>true</filtered>
        </fileSet>
        <!-- 指定输出target/classes中的配置文件到conf目录中 -->
        <fileSet>
            <directory>${basedir}/target/classes</directory>
            <includes>
                <include>application.yml</include>
                <include>application-${spring.profiles.active}.yml</include>
                <include>bootstrap.yml</include>
                <include>bootstrap-${spring.profiles.active}.yml</include>
                <include>log/logback-${spring.profiles.active}.xml</include>
                <include>bootstrap.yml</include>
            </includes>
            <outputDirectory>conf</outputDirectory>
            <fileMode>0644</fileMode>
        </fileSet>

        <!-- 将第三方依赖打包到lib目录中 -->
        <fileSet>
            <directory>${basedir}/target/lib</directory>
            <outputDirectory>lib</outputDirectory>
            <fileMode>0755</fileMode>
        </fileSet>

        <!-- 将项目启动jar打包到boot目录中 -->
        <fileSet>
            <directory>${basedir}/target</directory>
            <outputDirectory>boot</outputDirectory>
            <fileMode>0755</fileMode>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
        <!-- 将项目说明文档打包到docs目录中 -->
        <fileSet>
            <directory>${basedir}/src/main/md</directory>
            <outputDirectory>md</outputDirectory>
            <includes>
                <include>*.md</include>
            </includes>
            <fileMode>0644</fileMode>
        </fileSet>
        <fileSet>
            <directory>src/main/assembly/docs</directory>
            <outputDirectory>docs</outputDirectory>
            <fileMode>0644</fileMode>
        </fileSet>
    </fileSets>

    <dependencySets> 
        <dependencySet> 
            <outputDirectory>lib</outputDirectory> 
        </dependencySet> 
    </dependencySets>
</assembly>
  • 3.构建
    执行mvn打包命令即可将项目打包成对应的文件格式的压缩包
mvn clean package

如果存在上述POM文件中,多分支构建的场景,需使用-P确定具体需构建哪个分支,如: mvn clean package -P assembly-master