maven:assembly打包插件简记

maven:assembly打包插件简记
chify之前记录了maven:jar、dependency打包插件简记,这里再记录一下 maven-assembly打包插件的使用,方便日后回顾和查阅。
maven-assembly-plugin
assembly 也是 maven 下的一个打包插件,其可以将项目里的资源按照相应的配置(需要配置相应的 descriptor 描述文件)打包成一个包(支持 zip、jar、tar、tar.gz、tar.bz2包),其 pom 的配置和解释如下:
1 | <!-- maven-assembly-plugin 自定义打包貌似无法打可执行 Jar,这里用 maven-jar-plugin 来打可执行jar包--> |
自定义描述文件 vs 内置描述文件
graph TD
A[maven-assembly-plugin 打包方式] --> B[自定义描述文件]
A --> C[内置描述文件]
B --> D[assemblies/assembly.xml]
D --> E[完全控制目录结构
可自定义 fileSets
可自定义 dependencySets]
C --> F[jar-with-dependencies]
C --> G[bin]
C --> H[src]
C --> I[project]
F --> J[将依赖打入一个 uber-jar]
G --> K[打包为可执行分发包]
H --> L[打包源码]
I --> M[打包项目输出]
这里使用了 jar-plugin 来将项目打包成可执行 Jar,再通过 pom.xml 下的 <descriptor> 标签配置的描述文件 ,对项目里的资源进行整合打包成一个包文件,此次示例中用到的描述文件为:assemblies/assembly.xml ,其具体配置和解释如下:
1 | <!-- maven-assembly-plugin 自定义打包配置--> |
mvn:package 之后,打包后的会生成一个 *.tar.gz 文件,这个包里的文件就是按照描述里的配置而打包出来的,具体内容如下:
内置描述文件对比
| 描述文件 | 输出格式 | 包含内容 | 适用场景 |
|---|---|---|---|
jar-with-dependencies | jar | 项目代码 + 所有依赖解包合并 | 生成单个可执行 uber-jar |
bin | tar.gz / zip | 项目 jar + 依赖 jar + 脚本 | 生成可执行分发包(Linux) |
src | tar.gz / zip | 源码和资源文件 | 分发源码包 |
project | tar.gz / zip | 项目构建输出 | 分发构建产物 |
使用内置描述文件打包
默认的话 assembly 也有四个内置的 assembly descriptor 可以使用,在 maven-assembly-plugin.3.2.0.jar 下可以看到,相应的描述文件及其作用,如下图 bin.xml、jar-with-dependencies.xml 、src.xml、project.xml 都是其内置的描述文件,可以点击查看其相应的配置。
如果想用内置描述文件进行打包也可以,这里用 jar-with-dependencies.xml (将项目代码和其所依赖的所有 jar 都打包到一个 jar 里)这个内置描述文件做例子,其配置如下:
1 | <!-- maven-assembly-plugin 打包配置:jar-with-dependencies --> |
打包后的 jar 进行反编译,内容如下:
常见问题排查
1. Could not find goal single in plugin
maven-assembly-plugin 的 goal 必须通过 single 而不是 assembly 调用。正确写法:
1 | <goal>single</goal> |
2. 打包后文件名包含 assembly id
默认情况下打包产物名称为 finalName-descriptorId 格式。若想去掉后缀,需设置:
1 | <appendAssemblyId>false</appendAssemblyId> |
3. 自定义描述文件找不到
描述文件路径相对于项目根目录(即 pom.xml 所在目录)。确认文件存在于正确路径:
1 | ${project.basedir}/assemblies/assembly.xml |
4. 打包后缺少依赖
检查 dependencySet 中的 scope 配置:
runtime:包含compile和runtime作用域的依赖compile:仅包含compile作用域的依赖- 如需包含所有依赖,使用
compile+runtime
5. Linux 下脚本文件没有执行权限
打包后解压 tar.gz 发现 .sh 脚本没有可执行权限,需在 fileSet 中添加:
1 | <fileMode>0755</fileMode> |













