乐闻世界logo
搜索文章和话题

Maven Assembly Plugin 是什么?如何使用它创建分发包?

2月18日 21:54

Maven Assembly Plugin 是 Maven 提供的一个强大插件,用于创建自定义的分发包(Distribution)。它允许开发者将项目及其依赖打包成各种格式,如 ZIP、TAR、GZ 等,满足不同的分发需求。

Assembly Plugin 的作用:

  1. 创建可分发的软件包
  2. 打包项目及其所有依赖
  3. 支持自定义文件结构和布局
  4. 生成多种压缩格式
  5. 创建可执行的启动脚本

配置 Assembly Plugin:

  1. 添加插件依赖:
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>
  1. 使用预定义描述符:
  • 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 描述符的核心元素:

  1. formats:定义输出格式(zip、tar、tar.gz、jar、war 等)
  2. fileSets:定义文件集合,包含源文件和目标目录
  3. dependencySets:定义依赖集合,包含依赖的输出目录和范围
  4. files:定义单个文件
  5. 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:

bash
mvn clean package

生成的分发包位于 target 目录下。

最佳实践:

  1. 使用自定义描述符满足特定需求
  2. 合理组织文件结构,便于用户使用
  3. 包含 README 和 LICENSE 文件
  4. 设置正确的文件权限(fileMode)
  5. 使用 Profile 区分不同环境的分发包
  6. 在 CI/CD 流程中自动化分发包创建
  7. 定期测试分发包的可用性

常见问题解决:

  1. 依赖冲突:使用 <excludes> 排除不需要的依赖
  2. 文件权限:在 Unix 系统中设置正确的文件模式
  3. 路径问题:使用相对路径确保跨平台兼容性
  4. 包大小:使用 <useTransitiveFiltering> 控制依赖范围

Maven Assembly Plugin 是创建专业分发包的强大工具,能够满足各种复杂的分发需求。

标签:Maven