Maven Assembly Plugin 是 Maven 提供的一个强大插件,用于创建自定义的分发包(Distribution)。它允许开发者将项目及其依赖打包成各种格式,如 ZIP、TAR、GZ 等,满足不同的分发需求。
Assembly Plugin 的作用:
- 创建可分发的软件包
- 打包项目及其所有依赖
- 支持自定义文件结构和布局
- 生成多种压缩格式
- 创建可执行的启动脚本
配置 Assembly Plugin:
- 添加插件依赖:
xml<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.4.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 使用预定义描述符:
jar-with-dependencies:包含所有依赖的 JAR 包bin:二进制分发包src:源代码分发包project:项目分发包
自定义 Assembly 描述符:
创建 src/assembly/distribution.xml 文件:
xml<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 https://maven.apache.org/xsd/assembly-2.1.0.xsd"> <id>distribution</id> <formats> <format>zip</format> <format>tar.gz</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <baseDirectory>${project.artifactId}-${project.version}</baseDirectory> <fileSets> <fileSet> <directory>src/main/scripts</directory> <outputDirectory>bin</outputDirectory> <fileMode>0755</fileMode> </fileSet> <fileSet> <directory>src/main/config</directory> <outputDirectory>conf</outputDirectory> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>
在 POM 中引用自定义描述符:
xml<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.4.2</version> <configuration> <descriptors> <descriptor>src/assembly/distribution.xml</descriptor> </descriptors> </configuration> </plugin>
Assembly 描述符的核心元素:
- formats:定义输出格式(zip、tar、tar.gz、jar、war 等)
- fileSets:定义文件集合,包含源文件和目标目录
- dependencySets:定义依赖集合,包含依赖的输出目录和范围
- files:定义单个文件
- moduleSets:定义多模块项目的模块集合
创建可执行 JAR 包:
xml<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> </plugin>
创建启动脚本:
在 src/main/scripts 目录下创建启动脚本:
start.sh(Unix/Linux):
bash#!/bin/bash APP_HOME=$(cd "$(dirname "$0")"; pwd) java -jar $APP_HOME/lib/${project.artifactId}-${project.version}.jar
start.bat(Windows):
batch@echo off set APP_HOME=%~dp0 java -jar %APP_HOME%lib\${project.artifactId}-${project.version}.jar
使用 Assembly Plugin:
bashmvn clean package
生成的分发包位于 target 目录下。
最佳实践:
- 使用自定义描述符满足特定需求
- 合理组织文件结构,便于用户使用
- 包含 README 和 LICENSE 文件
- 设置正确的文件权限(fileMode)
- 使用 Profile 区分不同环境的分发包
- 在 CI/CD 流程中自动化分发包创建
- 定期测试分发包的可用性
常见问题解决:
- 依赖冲突:使用
<excludes>排除不需要的依赖 - 文件权限:在 Unix 系统中设置正确的文件模式
- 路径问题:使用相对路径确保跨平台兼容性
- 包大小:使用
<useTransitiveFiltering>控制依赖范围
Maven Assembly Plugin 是创建专业分发包的强大工具,能够满足各种复杂的分发需求。