打包是一个比较头疼的事情,默认maven打包的结果只包含项目本身的代码,如果要执行代码,还得带上依赖。如果希望将所有依赖放到指定的文件夹下,再在目录下写入shell脚本等之类的事情。maven-shade-plugin插件不能满足需求,而maven-assembly-plugin插件能够帮我们合理地归档文件。

简单的使用

assembly提供了几种默认的打包方式,使用 descriptorRefs, descriptorRef 有 bin, jar-with-dependencies, src, project。【不建议使用】

<plugins>
    <plugin>
        <!-- NOTE: We don't need a groupId specification because the group is
             org.apache.maven.plugins ...which is assumed by default.
         -->
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>

descriptor使用原理

assembly允许用户自定义归档文件格式,位置,结构等信息。允许配置并执行多个自定义配置。

所以每一个配置都需要一个唯一id来做区分。归档格式可以有tar.gz,dir,zip,war等等,允许同时归档出多种格式文件。对于打的jar包,可以指定输出目录。对于一组特定的文件,可以指定存放的文件夹。如果有单独需要存放的文件,也可以单独处理。

assembly配置

assembly配置分为两部分,一部分是assembly的配置文件,一部分是在pom.xml中的配置。

assembly配置文件

首先我们通过以下配置文件了解一下配置文件是怎么工作的。

<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
http://maven.apache.org/ASSEMBLY/2.0.0 ">

    <!--唯一ID-->
    <id>assembly_test</id>

    <!--打包格式,允许同时有多个-->
    <formats>
        <format>tar.gz</format>
        <format>dir</format>
        <format>zip</format>
    </formats>

    <!--依赖jar包以及项目打包文件存储文件-->
    <dependencySets>
        <dependencySet>
            <!--存储在projectName-assembly-version/lib下-->
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>

    <fileSets>
        <fileSet>
            <!--目录路径,如果不在这里指定,而在include中指定,那么其文件夹的也会被带进去-->
            <directory>src/main/bin/</directory>
            <includes>
                <!--要哪些文件-->
                <include>*.*</include>
            </includes>
            <excludes>
                <!--不要哪些文件-->
                <exclude>*.no_need</exclude>
            </excludes>
            <!--文件的权限-->
            <fileMode>0755</fileMode>
            <!--输出目录 存储在projectName-assembly-version/bin下-->
            <outputDirectory>bin</outputDirectory>
            <directoryMode>0755</directoryMode>

        </fileSet>
    </fileSets>

    <files>
        <!--针对单个文件-->
        <file>
            <!--源文件地址,相对于项目地址-->
            <source>pom.xml</source>
            <!--输出目录为projectName-assembly-version/-->
            <outputDirectory>.</outputDirectory>
            <!--文件的权限-->
            <fileMode>0755</fileMode>
            <!--重命名为-->
            <destName>pom.xml</destName>
        </file>
    </files>

</assembly>

pom中的配置

assembly插件在pom中配置较为简单,但需要配置maven自带的插件实现main方法添加和classpath依赖。假设上边的assembly配置文件在src/main/assembly/assembly.xml

pom配置内容为

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.1</version>
            <configuration>
                <archive>
                    <manifest>
                        <!--运行jar包时运行的主类,要求类全名-->
                        <mainClass>com.gavinzh.learn.assembly.Main</mainClass>
                        <!-- 是否指定项目classpath下的依赖 -->
                        <addClasspath>true</addClasspath>
                        <!-- 指定依赖的时候声明前缀 -->
                        <!--<classpathPrefix>./</classpathPrefix>-->
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <plugin>
            <!-- NOTE: We don't need a groupId specification because the group is
                 org.apache.maven.plugins ...which is assumed by default.
             -->
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>

            <executions>
                <execution>
                    <id>assembly_test</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>


    </plugins>
</build>

参考

Apache Maven Assembly Plugin

maven-assembly-plugin 简书

标签: java, maven, maven-assembly-plugin

添加新评论