首先,在pom.xml中<plugin></plugin>中添加assembly插件。
12345678910111213<
plugin
>
<
groupId
>org.apache.maven.plugins</
groupId
>
<
artifactId
>maven-assembly-plugin</
artifactId
>
<
version
>x.x.x</
version
>
<
configuration
>
...
</
configuration
>
<
executions
>
<
execution
>
...
</
execution
>
</
executions
>
</
plugin
>
<execution></execution>中设置maven的某个生命周期与插件的那个目标相互绑定(这个在lz的《maven插件详解》博文中有介绍),常规配置如下:
1234567<
execution
>
<
id
>assembly</
id
>
<
phase
>package</
phase
>
<
goals
>
<
goal
>single</
goal
>
</
goals
>
</
execution
>
<configuration></configuration>中重要的配置有如下几项:
(1) 设置assembly的打包细节:
这个是assembly的关键配置,assembly给出了一种自带的打包方式,配置如下:
123456<
configuration
>
<
descriptorRefs
>
<
descriptorRef
>jar-with-dependencies</
descriptorRef
>
</
descriptorRefs
>
...
</
configuration
>
这种方式打出的包是fat jar,也就是把依赖的jar包全部解压成class文件后,再与自己的代码打成一个jar包。
还有一种方式就是自定义打包,这种方式需要创建一个打包的配置文件:
123456<
configuration
>
<
descriptors
>
<
descriptor
>src/main/resources/assembly.xml</
descriptor
>
</
descriptors
>
...
</
configuration
>
这个文件的路径及名称都可以自己指定的,lz这里命名为assembly.xml,格式如下:
123<
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"
>
...
</
assembly
>
第一个属性是<id></id>,但是lz不知道它的作用,随便起了个名字。
第二个属性是<formats></formats>,这个用来指定打包的类型,支持以下类型
- “zip” – Creates a ZIP file format
- “tar” – Creates a TAR format
- “tar.gz” or “tgz” – Creates a gzip’d TAR format
- “tar.bz2” or “tbz2” – Creates a bzip’d TAR format
- “jar” – Creates a JAR format
- “dir” – Creates an exploded directory format
- “war” – Creates a WAR format
lz使用过zip、jar和dir(也就是输出到文件夹),都是好用的(貌似也支持同时定义多种格式,但是lz没尝试过),配置格式如下:
123<
formats
>
<
format
>jar</
format
>
</
formats
>
第三个属性是<includeBaseDirectory></includeBaseDirectory>,设置为true的话,会把指定打包的内容外在嵌套一个文件夹,没什么用处,所以lz都设置为false。
第四第五个属性都是来指定打包内容的,<fileSets></fileSets>用来设置所要打包的文件夹,<dependencySets></dependencySets>用来设置所要打包的依赖包。举个例子来说,lz想要把自己编写的代码编译后的class文件以及所需的依赖包的class文件打到jar包中,要如下设置:
123456789101112131415161718192021<
fileSets
>
<
fileSet
>
<
directory
>${project.basedir}/target/classes/</
directory
>
<
outputDirectory
>/</
outputDirectory
>
<
includes
>
<
include
>/**/*.class</
include
>
<
include
>*.xml</
include
>
<
include
>*.properties</
include
>
<
include
>*.yaml</
include
>
</
includes
>
</
fileSet
>
</
fileSets
>
<
dependencySets
>
<
dependencySet
>
<
outputDirectory
>/</
outputDirectory
>
<
includes
>
<
include
>org.yaml:snakeyaml</
include
>
</
includes
>
<
unpack
>true</
unpack
>
</
dependencySet
>
</
dependencySets
>
<directory></directory>指定所需打包内容所在文件夹,当然依赖就不用设置这个了。
<outputDirectory></outputDirectory>指定输出目录,lz在根目录输出,就设置为/。
<includes></includes>用来指定要打包的文件,不设置的话就全部都打包。还有一个与之对应的<excludes></excludes>,指定不被打入的文件。
<unpack></unpack>这个是依赖特有的,用来设置依赖包是否解压。true解压,就是以class的形式出现。false不解压,是以jar包的形式出现。但如果不解压的话,一般将依赖包放在执行包的外边,这样配置:
123456789101112<
formats
>
<
format
>dir</
format
>
</
formats
>
<
includeBaseDirectory
>false</
includeBaseDirectory
>
<
dependencySets
>
<
dependencySet
>
<
outputDirectory
>lib</
outputDirectory
>
<
excludes
>
<
exclude
>org.yaml:snakeyaml</
exclude
>
</
excludes
>
</
dependencySet
>
</
dependencySets
>
lz将format设置为dir,这样就将jar输出到可执行jar包的外面。lz指定在了dir文件夹下。
(2) 设置assembly打包的命名:
<appendAssemblyId></appendAssemblyId>来设置打出的包是否带有AssemblyId(也就是assembly.xml中设置的id)后缀。很好理解,但是这里有一点要特别注意:如果设置为false并且你要打出的包包括jar包的话,它会覆盖默认打出的包。这是因为在maven的打包阶段,还有一个插件也在执行,它就是maven-jar-plugin。它也会打出一个jar包,这个jar包就是你coding出的代码编译后的包。所以你要是想要那个包的话,要将这个值设置为true。
(3) 设置jar执行时的MANIFEST.MF:
MANIFEST.MF这个文件的作用就不多说了,在这里有两个配置是最主要的:mainclass和classpath,配置如下:
1234567<
archive
>
<
manifest
>
<
addClasspath
>true</
addClasspath
>
<
classpathPrefix
>lib/</
classpathPrefix
>
<
mainClass
>com.pxene.dmp.main.JobManager</
mainClass
>
</
manifest
>
</
archive
>
这里有一点要特别注意:因为assembly执行在package阶段,它所关联的依赖包的scope只是compile的,所以runtime阶段的jar包不会被指定在classpath下面(这个lz纠结了好久,才找到原因),所以lz把所有执行时期的依赖也设置为compile了。这种方式不太好,但是lz也没想到更好的解决方法。网上有人说用maven-jar-plugin来设置classpath,但是lz没成功。
转载请注明:毅-追梦 » maven assembly插件使用