总体介绍
assembly这个词,在这个插件里面我认为就可以翻译成:集合。
同时官网用一句话来介绍这个插件:
The Assembly Plugin for Maven is primarily intended to allow users to aggregate the project output along with its dependencies, modules, site documentation, and other files into a single distributable archive.
翻译过来就是:
Maven的Assembly Plugin主要用于允许用户将项目输出及其依赖项,模块,站点文档和其他文件聚合到一个可发行的存档中。
之前我们用的插件,打包的或者是打配置打依赖的,相对来说功能比较单一,而这个插件相对来说对于聚合文件来说是比较强大的,当然和其它插件是不冲突的,目的不同。
我的理解就是,它能够帮你把你这个工程所关联的任何你需要的内容以及本身全部打包到一个集合里面去,然后作为发行版,就能直接使用了。
我更喜欢用打包这个此,聚合可能更加专业以及准确。
上面有两个重点内容,关联的内容,集合。
拿我的需求来讲,我这边是写了一个客户端,我们想做了一个客户端的安装包,用户拿到以后直接解压,然后执行脚本,就能跑起来了。
所以我这边的目标集合就是一个zip包,关联的内容的话就是客户端所需要的内容:比如:依赖的jar包,启动的脚本,需要的中间件,相关的配置文件以及Jre等等。
根据自己的需求,明确这两个事情,然后就可以正确使用这个插件。
你有一堆文件,要搞到一个集合里面去,那就用这个插件就行了。
目标集合都有哪些呢?
目前支持:
zip
tar
tar.gz (or tgz)
tar.bz2 (or tbz2)
tar.snappy
tar.xz (or txz)
jar
dir
war
and any other format that the ArchiveManager has been configured for
我先暂时讲一下zip,毕竟我只用它了,后面要是用别的了,再详细讲述。
基本用法
在这个插件里面,一个目标集合的聚合过程是用一个描述文件(xml)来实现的,它可以有多个,所以重点就是这个xml的写法。
pom文件里面的配置比较简单。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/descriptors.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
上面的写法是最常见的一种,生命周期和package绑在一块了,直接package也挺方便的。
关于描述文件的xml的用法,我贴一下官网的,挺多内容的,如果自己有一些特殊需求,这个还是很有用的,仔细看看,没准能找到自己想要的。
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id/>
<formats/>
<includeBaseDirectory/>
<baseDirectory/>
<includeSiteDirectory/>
<containerDescriptorHandlers>
<containerDescriptorHandler>
<handlerName/>
<configuration/>
</containerDescriptorHandler>
</containerDescriptorHandlers>
<moduleSets>
<moduleSet>
<useAllReactorProjects/>
<includeSubModules/>
<includes/>
<excludes/>
<sources>
<useDefaultExcludes/>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<fileSets>
<fileSet>
<useDefaultExcludes/>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<directory/>
<lineEnding/>
<filtered/>
</fileSet>
</fileSets>
<includeModuleDirectory/>
<excludeSubModuleDirectories/>
<outputDirectoryMapping/>
</sources>
<binaries>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<attachmentClassifier/>
<includeDependencies/>
<dependencySets>
<dependencySet>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<useStrictFiltering/>
<outputFileNameMapping/>
<unpack/>
<unpackOptions>
<includes/>
<excludes/>
<filtered/>
<lineEnding/>
<useDefaultExcludes/>
<encoding/>
</unpackOptions>
<scope/>
<useProjectArtifact/>
<useProjectAttachments/>
<useTransitiveDependencies/>
<useTransitiveFiltering/>
</dependencySet>
</dependencySets>
<unpack/>
<unpackOptions>
<includes/>
<excludes/>
<filtered/>
<lineEnding/>
<useDefaultExcludes/>
<encoding/>
</unpackOptions>
<outputFileNameMapping/>
</binaries>
</moduleSet>
</moduleSets>
<fileSets>
<fileSet>
<useDefaultExcludes/>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<directory/>
<lineEnding/>
<filtered/>
</fileSet>
</fileSets>
<files>
<file>
<source/>
<outputDirectory/>
<destName/>
<fileMode/>
<lineEnding/>
<filtered/>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<useStrictFiltering/>
<outputFileNameMapping/>
<unpack/>
<unpackOptions>
<includes/>
<excludes/>
<filtered/>
<lineEnding/>
<useDefaultExcludes/>
<encoding/>
</unpackOptions>
<scope/>
<useProjectArtifact/>
<useProjectAttachments/>
<useTransitiveDependencies/>
<useTransitiveFiltering/>
</dependencySet>
</dependencySets>
<repositories>
<repository>
<outputDirectory/>
<includes/>
<excludes/>
<fileMode/>
<directoryMode/>
<includeMetadata/>
<groupVersionAlignments>
<groupVersionAlignment>
<id/>
<version/>
<excludes/>
</groupVersionAlignment>
</groupVersionAlignments>
<scope/>
</repository>
</repositories>
<componentDescriptors/>
</assembly>
官网对每一个标签都有解释。
这是官网地址
默认的描述文件
它提供了默认的4中描述文件:
1.bin
2.jar-with-dependencies
3.src
4.project
使用方法也比较简单:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/descriptors.xml</descriptor>
</descriptors>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
关于这几个的具体作用,可以自行网上搜索。
你有没有好奇这几个描述文件是怎么写的?官网有。默认的文件描述介绍
zip的简单实用
终于到了关键内容了,直接贴一个写好的吧。
上面都有注释,都不解释了。
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<!-- ID,它会是后面生成的集合的名称的一部分,应该是后缀,前面会用这个工程的名字和版本,两个拼接在一块-->
<id>client_linux_64</id>
<!--格式,目标集合的格式,这个可以放多个 -->
<formats>
<format>zip</format>
</formats>
<!--不包含基本目录,基本目录是啥?就是当前工程的:artifactId-version
如果包含的话,那会再最上面建一层目录,你下面定义的所有的输入,都会在这个目录里面
感觉一般都不会这样做,感觉那样的名字不好,一般会希望自定义一个名字,我的做法就是
在下面所有的outputDirectory的路径前面加一个就行了。或者根本不需要
-->
<includeBaseDirectory>false</includeBaseDirectory>
<!--文件集合,定义多个集合,这个指的是源文件的集合,然后拷贝到目录目录-->
<fileSets>
<fileSet>
<directory>${project.basedir}/src/main/config</directory>
<outputDirectory>client/config</outputDirectory>
<includes>
<include>*.*</include>
</includes>
</fileSet>
<!--这个是一个配置,操作系统的不同,里面的配置有一点点不同,所以定义了两个。
我其实是想定义一个,然后另外一个拷贝的过程中,把里面的内容改一下就行了,
这个我没找到怎么做。之前用ant,就可以做到。-->
<fileSet>
<directory>${project.basedir}/src/main/config/linux</directory>
<outputDirectory>client/config</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.basedir}/src/main/bin</directory>
<outputDirectory>client/bin</outputDirectory>
<includes>
<include>*.sh</include>
</includes>
</fileSet>
<!--jre有windows和linux的,所以就定义了两个目录-->
<fileSet>
<directory>${project.basedir}/src/main/jre/jre-linux</directory>
<outputDirectory>client/jre</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<useProjectArtifact>true</useProjectArtifact>
<outputDirectory>client/lib</outputDirectory>
<scope>runtime</scope>
<!--去除的依赖项,格式是:groupId:artifactId-->
<excludes>
<exclude>org.slf4j:slf4j-api</exclude>
</excludes>
<!--打出来的依赖的jar的格式,这个是用来解决带时间戳问题的,
看自己需求,这个标签也可以不需要-->
<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>
</dependencySet>
</dependencySets>
</assembly>
不管是dependencySets还是fileSets,定义的都是源头,然后目录的话,都是定义的集合里面,在这个里面,就是zip里面的。然后跑起来试一下吧。
简单总结
工具很强大,用一个工具,至少得明白,它是干什么的,就是我最前面介绍的那部分,很重要。其次,要明白自己的需求,有问题了,多去官网看看,多试试,大多数都是可以自己解决的。