当项目中对打包有一些特殊需求时,比如想打包成zip或tar.gz格式的包时,可以使用maven-assembly-plugin插件来实现自定义打包输出路径及一系列特定需求。

本文将会对该插件的常见使用方式及各标签作一些详细的介绍,更为细致的需求请自行访问该插件官网:http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

1、pom文件中配置该插件,如下图:

<build>
                <plugins>
                    <plugin>
                        <!-- 配置插件坐标 -->
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>2.6</version>
                        <!-- 配置执行器 -->
                        <executions>
                            <execution>
                                <!-- 名称随意,最好与描述文件中的id一致,不一致也无所谓,只要文件路径写对也能找到 -->
                                <id>build-bin</id>
                                <!-- 绑定到package生命周期阶段上,该标签决定了该插件的作用 -->
                                <phase>package</phase>
                                <goals>
                                    <!-- 只运行一次 -->
                                    <goal>single</goal>
                                </goals>
                                <configuration>
                                    <tarLongFileMode>gnu</tarLongFileMode>
                                    <descriptors>
                                        <!-- 配置描述文件路径,一般使用相对目录即可 -->
                                        <descriptor>assembly.xml</descriptor>
                                    </descriptors>
                                    <outputDirectory>target</outputDirectory>
                                    <!-- 自定义输出包的名称 -->
                                    <finalName>platform-notify</finalName>
                                    <!-- 该标签默认为true,指定为false后包名将不会自动带上描述文件的id -->
                                    <appendAssemblyId>false</appendAssemblyId>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>

2、描述文件的详细信息如下图,完整版:

<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 -->
	<id>build-bin</id>
	<!-- 是否生成和压缩包同名的项目跟目录 -->
	<includeBaseDirectory>true</includeBaseDirectory>
	<!-- 指定程序集格式 -->
	<formats>
		<format>dir</format>
		<format>tar.gz</format>
	</formats>

	<!-- 用于执行排除或包含某些依赖的操作,一般打包需求时往往不需要配置该标签 -->
	<dependencySets>
		<dependencySet>
			<!-- 该标签默认为true,改为false之后将不会新建文件夹 -->
			<useProjectArtifact>false</useProjectArtifact>
			<!-- 文件的输出路径 -->
			<outputDirectory>.</outputDirectory>
			<!-- 包含该依赖 -->
			<includes>
				<include>uyun.soft:util-shell:tar.gz</include>
			</includes>
			<!-- 默认为false,改为true之后表示解压上面的依赖 -->
			<unpack>true</unpack>
			<!-- 默认即为runtime -->
			<scope>runtime</scope>
			<!-- 文件权限 读权限为4;写权限为2;执行权限为1;第一位7表示文件所有者所拥有的权限;第二位5表示文件所有者同组用户所拥有的权限;
			 第三位5表示公共用户所拥有的权限-->
			<fileMode>0755</fileMode>
		</dependencySet>
	</dependencySets>

	<fileSets>
		<!-- 这里就是自定义各文件的输出路径 -->
		<fileSet>
			<!-- 文件所在项目中的目录,相对于该描述文件的路径 -->
			<directory>../core/target/classes</directory>
			<!-- 打包后的生成路径,若不存在会直接创建 -->
			<outputDirectory>resources/notify/spring-conf</outputDirectory>
			<!-- 目录下特定的文件 可模糊匹配也可特定 -->
			<includes>
				<include>application.yaml</include>
				<include>spring-context.xml</include>
				<include>spring-dubbo.xml</include>
			</includes>
			<!-- 文件权限 -->
			<fileMode>0755</fileMode>
		</fileSet>
		<fileSet>
			<directory>../core/target/classes/database</directory>
			<outputDirectory>resources/notify/database</outputDirectory>
			<includes>
				<include>*.sql</include>
			</includes>
			<fileMode>0755</fileMode>
		</fileSet>
		<fileSet>
			<directory>../core/target</directory>
			<outputDirectory>resources/notify/lib</outputDirectory>
			<includes>
				<include>**/*.jar</include>
			</includes>
			<fileMode>0755</fileMode>
		</fileSet>
		<fileSet>
			<directory>..</directory>
			<outputDirectory>resources/notify/</outputDirectory>
			<lineEnding>unix</lineEnding>
			<includes>
                <include>module.yaml</include>
            </includes>
			<fileMode>0755</fileMode>
		</fileSet>
		<fileSet>
			<directory>../conf/disconf</directory>
			<outputDirectory>resources/notify/conf</outputDirectory>
			<includes>
				<include>platform-notify.properties</include>
			</includes>
			<fileMode>0755</fileMode>
		</fileSet>
		<fileSet>
			<directory>resources</directory>
			<outputDirectory>resources/notify/bin</outputDirectory>
			<includes>
				<include>test_send.sh</include>
				<include>platform-notify.sh</include>
				<include>set-env.sh</include>
			</includes>
			<!-- 指定行尾 unix的结束行尾一般为换行符即\n,windows等与之相对应的则为回车符\d -->
			<lineEnding>unix</lineEnding>
			<fileMode>0755</fileMode>
		</fileSet>
		<fileSet>
			<directory>resources</directory>
			<outputDirectory>.</outputDirectory>
			<includes>
				<include>install.sh</include>
			</includes>
			<lineEnding>unix</lineEnding>
			<fileMode>0755</fileMode>
		</fileSet>
	</fileSets>
</assembly>

当项目中存在多个微服务进程模块时,可分别配置该xml统一每个进程的打包方式,方便使用自动化工具来进行统一的管理和部署工作。