maven assembly插件使用

  • lz曾经写过关于maven assembly使用方法的文章。最近又用到了该插件,发现上次写的太皮毛了,所以果断删掉以前的。结合这次的使用以及maven的官方文档,重新再写一篇。

    首先,在pom.xml中<plugin></plugin>中添加assembly插件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    < 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插件详解》博文中有介绍),常规配置如下:

    1
    2
    3
    4
    5
    6
    7
    < execution >
         < id >assembly</ id >
         < phase >package</ phase >
         < goals >
             < goal >single</ goal >
         </ goals >
    </ execution >

    <configuration></configuration>中重要的配置有如下几项:

    (1) 设置assembly的打包细节:

    这个是assembly的关键配置,assembly给出了一种自带的打包方式,配置如下:

    1
    2
    3
    4
    5
    6
    < configuration >
         < descriptorRefs >
             < descriptorRef >jar-with-dependencies</ descriptorRef >
         </ descriptorRefs >
         ...
    </ configuration >

    这种方式打出的包是fat jar,也就是把依赖的jar包全部解压成class文件后,再与自己的代码打成一个jar包。

    还有一种方式就是自定义打包,这种方式需要创建一个打包的配置文件:

    1
    2
    3
    4
    5
    6
    < configuration >
         < descriptors >
             < descriptor >src/main/resources/assembly.xml</ descriptor >
         </ descriptors >
         ...
    </ configuration >

    这个文件的路径及名称都可以自己指定的,lz这里命名为assembly.xml,格式如下:

    第一个属性是<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没尝试过),配置格式如下:

    1
    2
    3
    < formats >
         < format >jar</ format >
    </ formats >

    第三个属性是<includeBaseDirectory></includeBaseDirectory>,设置为true的话,会把指定打包的内容外在嵌套一个文件夹,没什么用处,所以lz都设置为false。

    第四第五个属性都是来指定打包内容的,<fileSets></fileSets>用来设置所要打包的文件夹,<dependencySets></dependencySets>用来设置所要打包的依赖包。举个例子来说,lz想要把自己编写的代码编译后的class文件以及所需的依赖包的class文件打到jar包中,要如下设置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    < 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包的形式出现。但如果不解压的话,一般将依赖包放在执行包的外边,这样配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    < 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,配置如下:

    1
    2
    3
    4
    5
    6
    7
    < 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插件使用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值