mvn assembly 插件

简单的说,maven-assembly-plugin 就是用来帮助打包用的,比如说打出一个什么类型的包,包里包括哪些内容等等。

下面看看怎么用maven-assembly-plugin插件来定制化打包。

首先需要添加插件声明:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <!-- 绑定到package生命周期阶段上 -->
            <phase>package</phase>
            <goals>
                <!-- 绑定到package生命周期阶段上 -->
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Assembly Descriptor

使用内置的Assembly Descriptor,或者使用自定义的Assembly Descriptor
要使用maven-assembly-plugin,需要指定至少一个要使用的assembly descriptor 文件。默认情况下,maven-assembly-plugin内置了几个可以用的assembly descriptor:

  • bin : 类似于默认打包,会将bin目录下的文件打到包中;
  • jar-with-dependencies : 会将所有依赖都解压打包到生成物中;
  • src :只将源码目录下的文件打包;
  • project : 将整个project资源打包。

自定义Assembly Descriptor: 一般来说,内置的assembly descriptor都不满足需求,这个时候就需要写自己的assembly descriptor的实现了。先从一个最简单的定义开始:

<?xml version='1.0' encoding='UTF-8'?>
<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 的话,目标文件则是 ${artifactId}-${id}.tar.gz -->   
    <id>demo</id>
    <!--format:指定打包类型 --> 
    <formats>
        <format>jar</format>
    </formats>
    <!--includeBaseDirectory:指定是否包含打包层目录(比如finalName是output,当值为true,所有文件被放在output目录下,否则直接放在包的根目录下) --> 
    <includeBaseDirectory>false</includeBaseDirectory>
    <!--fileSets:指定要包含的文件集,可以定义多个fileSet --> 
    <fileSets>
        <fileSet>
            <!--directory:指定要包含的目录 --> 
            <directory>${project.build.directory}/classes</directory>
            <!--outputDirectory:指定当前要包含的目录的目的地 --> 
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

要使用这个assembly descriptor,需要在pom文件中加入如下配置:

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                    <!-- 绑定到package生命周期阶段上 -->
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <finalName>demo</finalName>  
						    <descriptors>
						        <!--描述文件路径-->
						        <descriptor>assemblies/demo.xml</descriptor>  
						    </descriptors>  
						    <outputDirectory>output</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
			</plugin>

最后会生成一个demo-demo.jar 文件在目录 output 下,其中前一个demo来自finalName后一个demo来自assembly descriptor中的id,其中的内容和默认的打包出来的jar类似。如果只想有finalName,则增加配置

<appendAssemblyId>false</appendAssemblyId>  

添加文件

上面演示了添加所有编译后的资源,同样的可以增加其他资源例如想添加当前工程目录下的某个文件 b.txt ,在assembly descriptor的assembly结点下增加,这里用到了 files 元素类型,可以想象 fileSets 下的结点都是针对文件夹的files 下的结点都是针对文件的。

<files>
    <file>
        <source>b.txt</source>
        <outputDirectory>/</outputDirectory>
    </file>
</files>

也可以改变打包后的文件名,例如上面的 b.txt ,希望打包后的名字为 b.txt.bak, 只需要在file 里添加以下配置 :

<destName>b.txt.bak</destName>

排除文件:在 fileSet 里可以使用 includes 和 excludes 来更精确的控制哪些文件要添加,哪些文件要排除。例如要排除某个目录下所有的txt文件:

<fileSet>  
    <directory>${project.build.directory}/classes</directory>  
    <outputDirectory>/</outputDirectory>  
    <excludes>  
        <exclude>**/*.txt</exclude>  
    </excludes>  
</fileSet>

或者某个目录下只想 .class 文件:

<fileSet>
    <directory>${project.build.directory}/classes</directory>
    <outputDirectory>/</outputDirectory>
    <includes>
        <include>**/*.class</include>
    </includes>
</fileSet>

添加依赖

如果想把一些依赖库打到包里,可以用 dependencySets 元素,例如最简单的,把当前工程的所有依赖都添加到包里:在assembly下添加下面配置,则当前工程的依赖工程本身生成的jar都会被打包进来。

<dependencySets>
    <dependencySet>
        <outputDirectory>/</outputDirectory>
    </dependencySet>
</dependencySets>

如果要排除工程自身生成的jar,则可以添加

<useProjectArtifact>false</useProjectArtifact>

unpack参数可以控制依赖包是否在打包进来时是否解开,例如解开所有包,添加以下配置:

<unpack>true</unpack>

和 fileSet 一样,可以使用 excludes 和 includes 来更详细的控制哪些依赖需要打包进来;另外 useProjectAttachments,useTransitiveDependencies(用传递依赖),useTransitiveFiltering(用传递依赖的过滤)等参数可以对间接依赖传递依赖进行控制。

useTransitiveDependencies 与 useTransitiveFiltering的用法

useTransitiveDependencies 定义:决定是否包括传递依赖默认true

  • true:包括所有的传递依赖
  • false:只包括直接依赖,不包含传递依赖。

示例:
假设A项目具有以下依赖关系:A 依赖 B (直接依赖)、B 依赖 C (传递依赖)

useTransitiveDependencies=true: 运行插件时,A 项目将包含 B 和 C 依赖

useTransitiveDependencies=false:运行插件时,A 项目只包含 B 依赖,不包含 C

useTransitiveFiltering 定义:控制在处理传递性依赖时是否使用依赖过滤,默认false

  • true:对传递依赖使用过滤规则
  • false:对传递依赖不使用过滤规则

示例: 还是以A 项目为例,假设我们有以下配置:项目 A 的直接依赖是 B、项目 B 的依赖是 C。
我们对依赖使用了一些过滤规则,比如排除某些版本的依赖
useTransitiveFiltering=true: 在这种情况下,传递依赖中的 example-artifact:1.0 将被排除

<dependencySets>
        <dependencySet>
            <unpack>false</unpack>
            <excludes>
                <exclude>xxx:example-artifact</exclude>
            </excludes>
            <outputDirectory>/lib</outputDirectory>
            <!-- lib里面不包含当前project打包成的jar -->
            <useProjectArtifact>false</useProjectArtifact>
            <!-- 是否过滤传递依赖的包 -->
            <useTransitiveFiltering>true</useTransitiveFiltering>
        </dependencySet>
    </dependencySets>

useTransitiveFiltering=false: 在这种情况下,即使配置了过滤规则传递依赖中的 example-artifact:1.0 也不会被排除,所有传递依赖都会包含在内。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值