需要引入三个Maven插件:

  1. maven-jar-plugin:用于打包代码,并去除不需要一起打包的resource文件
  2. maven-assembly-plugin:主要用来打压缩包,配置我们打包后的整体文件结构
  3. maven-antrun-plugin:主要用来解压 maven-assembly-plugin 插件打好的压缩包,去掉打包完成后自己去手动解压的步骤

maven-jar-plugin配置:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <!--指定入口类,必须全类名-->
                            <mainClass>com.andlinks.art.ArtApplication</mainClass>
                            <!-- 指定依赖的声明前缀,会在依赖Jar包的路径加上前缀lib/ -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!--为true后会将所有依赖Jar包的路径写入 MANIFEST Class-Path 中-->
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <!--添加一个 Class-Path 路径-->
                            <Class-Path>resources/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <excludes>
                        <!--排除掉打包进Jar中的文件 **/ 表示所有目录,根据自己 实际情况选择排除的文件-->
                        <exclude>**/*.yml</exclude>
                        <exclude>**/*.sh</exclude>
                        <exclude>**/bin/</exclude>
                        <exclude>**/conf/</exclude>
                        <exclude>**/*.xml</exclude>
                        <exclude>**/*.properties</exclude>
                    </excludes>
                </configuration>
            </plugin>

maven-assembly-plugin 配置:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                     <!--configuration配置后,将会生成一个{finalname}-{assembly-descriptor中的id}.jar 文件在目录 output 下,其中的内容和默认的打包出来的jar类似,
                    如果只想有finalName,则增加配置:<appendAssemblyId/>-->
                    <appendAssemblyId>false</appendAssemblyId>
                    <!--压缩包的输出目录-->
                    <outputDirectory>${project.build.directory}/dist/</outputDirectory>
                    <descriptors>
                        <!--descriptor文件目录-->
                        <descriptor>src/main/resources/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <!--无特殊用途-->
                        <id>make-assembly</id>
                        <!--绑定到package生命周期阶段上-->
                        <phase>package</phase>
                        <goals>
                            <!--只运行一次-->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

assembly.xml 文件参考:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
          
    <!--标识符,添加到生成文件名称的后缀符。如果指定 id 的话,目标文件则是 ${artifactId}-${id}.zip-->
    <id>demo</id>
    <formats>
            <!--指定打包类型: zip、tar、tar.gz(or tgz)、tar.bz2 (or tbz2)、tar.snappy 、tar.xz (or txz)、jar、dir、war-->
        <format>zip</format>
    </formats>

    <!--是否包含根目录,为true会将所有文件放置在压缩包的{finalName}命名的文件夹中-->
    <includeBaseDirectory>false</includeBaseDirectory>

    <!--指定打包的文件与输出目录-->
    <fileSets>
        <fileSet>
            <!--打包resources目录下的所有文件-->
            <directory>src/main/resources</directory>
            <!--输出至resources目录-->
            <outputDirectory>/resources</outputDirectory>
            <excludes>
                <!--排除assembly.xml 文件-->
                <exclude>assembly.xml</exclude>
            </excludes>
        </fileSet>
    </fileSets>

    <!--项目依赖的处理-->
    <dependencySets>
        <dependencySet>
            <!--是否打包项目本身JAR包-->
            <useProjectArtifact>false</useProjectArtifact>
            <!--依赖输出目录-->
            <outputDirectory>/lib</outputDirectory>
            <!--打包的依赖默认生命周期级别-->
            <scope>runtime</scope>
            <!--排除文件配置-->
            <excludes>
                <exclude>${project.groupId}:${project.artifactId}</exclude>
            </excludes>
        </dependencySet>
        <!--将项目本身JAR包放到输出目录根目录下-->
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>${project.groupId}:${project.artifactId}</include>
            </includes>
        </dependencySet>
    </dependencySets>
</assembly>

压缩包自解压配置:

<plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- 绑定到package生命周期阶段上 -->
                        <phase>package</phase>
                        <configuration>
                            <tasks>
                                <echo message="unziping ${project.artifactId}.zip"/>
                                <!-- src:需要解压文件的路径,dest:文件解压之后的路径 -->
                                <unzip src="target/dist/${project.artifactId}.zip" dest="target/dist/${project.artifactId}"/>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>