Maven Assembly 插件
基础插件信息
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>3.1.0</version>
</plugin>
Descriptor
我们可以提供descriptor来指定具体的打包方式。
<configuration>
	<descriptors>
		<descriptor</descriptor>
	</descriptors>
</configuration>
下面我们描述内置的Descriptor:
- jar-with-dependencies: 打包依赖
- src: 打包源代码
- bin: 打包bin目录
- project: 打包整个项目
内置的descriptor需要使用特殊的标签来包含:
<configuration>
	<descriptorRefs>
		<descriptorRef>jar-with-dependencies</descriptorRef>
	</descriptorRefs>
</configuration>
你可以同时指定多个描述符:
<configuration>
	<descriptors>
		<descriptor</descriptor>
	</descriptors>
    	<descriptorRefs>
		<descriptorRef>jar-with-dependencies</descriptorRef>
	</descriptorRefs>
</configuration>
文件配置
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
	
  <id>release</id> <!--指定打包后缀-->
  <formats> <!--打包格式,可以指定多个-->
    <format>tar.gz</format>
    <format>dir</format>
  </formats>
  <dependencySets> <!--依赖管理-->
    <dependencySet>
      <outputDirectory>/lib</outputDirectory> <!--输出到压缩包的/lib目录下-->
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <includes>
        <include>bin/**</include>
      </includes>
      <fileMode>0755</fileMode>
    </fileSet>
    <fileSet>
      <includes>
        <include>/conf/**</include>
        <include>logs</include>
      </includes>
    </fileSet>
  </fileSets>
  <files>
    <file>
      <source>README.txt</source>
      <outputDirectory>/</outputDirectory>
    </file>
  </files>
</assembly>
include和exclude
include和exclude用于指定包含文件和排除文件,当一个文件满足所有的include条件和不满足exclude条件下,才会被包含。
在使用depedencySet和moduleSet的时候,include和exclude使用artifacts而非文件名,这样就可以避免我们需要得知artifact在本地的实际存储名字。格式必须为以下三种之一:
- groupId:artifactId:type:classifier
- groupId:artifactId
- groupId:artifactId:type:classifier:version
其中type默认为jar,而classifier在为空时会被忽略。
如果在格式中包含了通配符,那么将会分别计算文件的三种格式的信息,如果任意其一包含了剩余的子串,那么将认为匹配。
比如要匹配所有的war文件,则可以使用*:war:*。
如果没有指定通配符,那么将会拿模式串与三种格式做等值比较。
fileSet
fileSet用于包含文件,由于文件中可能会出现一些元文件(比如.git等),assembly会默认帮我们将其剔除,但是如果希望包含它们,我们需要先指定useDefaultExcludes为false。
<fileSets>
    <fileSet>
      <useDefaultExcludes>false</useDefaultExcludes>
      <excludes>
        <exclude>**/target/**</exclude>
      </excludes>
    </fileSet>
  </fileSets>
fileSet拥有两个重要属性,outputDirectory和directory。两者默认值均为/(输出目录的根目录对应输出文件名-${配置的id},输入目录的默认值为${basedir})。前者表示输出目录,后者表示来源目录,看下面例子:
<fileSets>
    <fileSet>
        <outputDirectory>/conf</outputDirectory>
        <directory>/</directory>
        <includes>
        	<include>/src/main/conf/*</include>
        </includes>
    </fileSet>
</fileSets>
上面会在target下建立输出文件名-${配置的id}/输出文件名/conf/src/main/conf。而如果指定了directory:
<fileSets>
    <fileSet>
        <outputDirectory>/conf</outputDirectory>
        <directory>/src/main/conf</directory>
        <includes>
        	<include>*</include>
        </includes>
    </fileSet>
</fileSets>
则会将/src/main/conf下的所有文件(仅一级)拷贝到输出文件名-${配置的id}/输出文件名/conf下。
dependencySets
dependencySets用于操作依赖。
<dependencySets>
    <dependencySet>
        <outputDirectory>/lib</outputDirectory>
        <scope>runtime</scope> <!--仅包含runtime所需包-->
        <fileMode>0444</fileMode>
    </dependencySet>
</dependencySets>
- fileMode:指定文件的权限,由4位数字决定,第二位为当前用户权限,第三位为同组用户权限,第四位为其他用户权限。
Archive
Assembly插件提供了archive元素,该元素由maven-archiver处理。只有jar和war格式允许由archive元素。
manifest
打包的时候可以指定manifest文件中的包含内容。
<configuration>
    <archive>
        <manifest>
        	<mainClass>org.sample.App</mainClass>
        </manifest>
    </archive>
</configuration>
附录
详细文件配置模板:
