Maven 插件使用
maven-assembly-plugin 篇
文章目录
前言
随便说点
一直使用maven-assembly插件,没有对其做一个总结,这里简单记录一下assembly打包的三种方式,并没有对参数有更多的涉及,后期会持续进行跟进补充(欢迎评论区指正)
以下是本篇文章正文内容
一、maven-assembly插件是什么?
相同类型的插件对比
插件 | 功能 |
---|---|
maven-jar-plugin | 传统的打包方式,会在target下生成jar包文件 |
maven-dependency-plugin | 将一系列依赖artifacts打包到指定目录下 |
maven-assembly-plugin | 提供定制化打包的服务,分为single-project/multimodule-project/sharing-descriptor三种模式 |
二、Single Project(单项目模式)
Single Project Apache 官网说明
Single Project即所有操作都是在当前项目下完成的,不会涉及到别的项目。
1.项目目录
2.POM文件
POM内容
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<!--here is the sample of single project-->
<execution>
<id>assem-single-dist</id>
<phase>prepare-package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<filters>
<filter>${basedir}/src/assembly/filter.properties</filter>
</filters>
<descriptors>
<descriptor>${basedir}/src/assembly/single-dist.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
这里表示的是maven-assembly插件会在prepare-package
阶段(maven phase生命周期 后期会写文章分享学习心得)执行goal:single
。具体行为为读取src/assembly/single-dist.xml
下的内容进行文件的相关操作,并且通过src/assembly/filter.properties
的规则对部分文件内容进行替换
3.single-dist.xml
XML内容
<assembly>
<id>single-distro</id>
<formats>
<format>jar</format>
</formats>
<files>
<file>
<source>README.txt</source>
<outputDirectory></outputDirectory>
<filtered>true</filtered>
</file>
</files>
</assembly>
该xml描述了对当前项目下的文件做何种转移操作,这里只是简单的将项目目录下的README文件打包到项目target目录下,<formats>
表示文件打包的格式,当前是打包成jar,<filtered>
决定是否进行内容替换,这里的内容替换文件为src/assembly/filter.properties
4.filter.properties
内容替换
username=admin
password=12345
原先README的文件内容:
${username}
${password}
替换后Target目录生成的README文件内容:
admin
12345
filter.properties文件采用 ‘变量=替换的值’形式,对<filtered>
为true的文件进行占位符替换操作。
5.生成文件演示
三、Sharing Descriptor(分享 文件操作)
Sharing Descriptor 官网说明
Single Project 的 descriptor是在当前项目下的,比较规范的操作是,把所有的descriptor放在特定的项目下,并在别的项目中进行descriptor的引用,这样文件操作和项目内容就可以解耦。比如apache-hadoop项目,就单独开了一个assemblies,里面都是对项目文件的操作xml。
1.Descriptor存放位置(单独项目)
Project:assembly-sharing-descriptor
如果想在其他项目中进行descriptor的引用,必须将该descriptor存放在/src/main/resources/assemblies
下,并且在其他项目的plugin-dependency中进行引用(否则无法找到)
2.需要获取Descriptor的项目
Project:assembly-sharing [注意区分]
POM文件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<!--if you want to use sharing mode, you must add plugin dependencies here-->
<dependencies>
<dependency>
<groupId>com.laozhaer</groupId>
<artifactId>assembly-sharing-descriptor</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<executions>
<!--here is the sample of sharing descriptor-->
<execution>
<id>assem-sharing-dist</id>
<phase>prepare-package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<attach>false</attach>
<finalName>${project.artifactId}-${project.version}</finalName>
<descriptorRefs>
<descriptorRef>sharing-dist</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
descriptorRef即需要搜索的xml名字,具体搜索位置为artifact:assembly-sharing-descriptor。
这里的最后生成打包就不在进行演示(效果和第一种模式一样)
四、Multi-Module Project(多module打包模式)
Multi-Module 官网说明
multi-module打包模式主要是为了在父项目下获取子项目的module对应binary文件(可能是多级module)并打包。
1.目录结构
这里需要注意的是,我们想在assembly-multimodule下进行assembly-child2的binary文件获取,若将assembly-child1的parent设置成assembly-multimodule,则会因为maven的打包顺序打包失败,因为父项目打包时,子项目的binary并没有生成。
Please ensure the package phase is run before the assembly is generated.
所以建了一个空项目assembly-multimodule-pre,并且将子项目的pom文件都指向这个空项目,在maven打包时,assembly-multimodule-pre先于assembly-multimodule完成。
当执行到assembly-multimodule时,子项的binary已经打包完成,便可执行assembly。
2.multimodule-dist.xml
采用了第二种模式,也存放在Project:assembly-sharing-descriptor
XML内容
<assembly>
<id>multi-module-distro</id>
<formats>
<format>zip</format>
</formats>
<moduleSets>
<moduleSet>
<includes>
<include>com.laozhaer:assembly-child2</include>
</includes>
<binaries>
<outputDirectory>assem-module</outputDirectory>
<unpack>false</unpack>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
3.相关补充
Assembly的文件操作形式有三种,分别为FileSet,ModuleSet和DependencySet
因为这里介绍的是打包形式,module打包比较特殊,所以只介绍了moduleSet的相关用法ModuleSet
当前操作为,在assembly-multimodule项目的target目录下生成包含com.laozhaer:assembly-child2这个module的zip文件。
assembly-multimodule POM文件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<dependencies>
<dependency>
<groupId>com.laozhaer</groupId>
<artifactId>assembly-sharing-descriptor</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>multi-dist</id>
<phase>prepare-package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<attach>false</attach>
<finalName>${project.artifactId}-${project.version}</finalName>
<descriptorRefs>
<descriptorRef>multimodule-dist</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
4.生成文件演示
总结
简单记录了一下assembly的使用形式,如果大家还有问题欢迎在评论区留言。
具体的代码:资源链接
后续会更新更多maven实用插件的使用。