在 Maven 中使用 assembly 插件自定义打包结构,核心是编写 XML 格式的 assembly descriptor 文件(如 src/assembly/bin.xml),并通过 maven-assembly-plugin 引用它来控制包内容、目录结构和归档格式;需在 pom.xml 中配置插件、指定 descriptor 路径、设置 formats、fileSets 和 dependencySets 等元素,并可通过 dir 格式或调试参数验证结果。

在 Maven 中使用 assembly 插件自定义打包结构,核心是编写一个 assembly descriptor(描述文件),再通过 maven-assembly-plugin 引用它来控制最终生成的包内容、目录结构和文件归档方式。
准备 assembly 描述文件
描述文件通常为 XML 格式(如 src/assembly/bin.xml),定义要包含的文件、目录、依赖、模块等。Maven 不强制文件位置,但建议放在 src/assembly/ 下便于管理。
基础结构示例如下:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0
https://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>bin</id>
<formats>
<format>tar.gz</format>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>src/main/scripts</directory>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
关键点说明:
-
id:用于生成归档文件名后缀,如
myapp-bin.tar.gz -
formats:指定输出格式,支持
jar、tar.gz、zip、dir等 -
fileSets:复制项目内文件或目录,可设权限(
fileMode)、目标路径(outputDirectory) -
dependencySets:控制依赖 JAR 的打包方式,
useProjectArtifact决定是否包含当前项目主 JAR
在 pom.xml 中配置插件并引用 descriptor
在 pom.xml 的 <build><plugins> 中添加 maven-assembly-plugin,并指定 descriptor 文件路径:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<descriptor>src/assembly/bin.xml</descriptor>
<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>
注意:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
<descriptor>指向你写的 XML 文件;也可用<descriptors>列表支持多个 descriptor -
<archive>部分可配置 MANIFEST.MF(如设置 Main-Class),对可执行 JAR 或脚本启动很重要 -
<phase>package</phase>表示在mvn package阶段触发打包
常用 descriptor 元素与技巧
除了 fileSet 和 dependencySet,还可灵活组合以下元素:
- moduleSets:打包多模块项目中的其他子模块输出(适合聚合项目)
-
files:单个文件复制(比
fileSet更细粒度,可重命名) -
containerDescriptorHandlers:处理特殊资源(如 Spring Boot 的
META-INF/spring.factories) -
filters:配合 Maven 资源过滤,在打包时替换占位符(如
${project.version})
例如,把当前项目 JAR 放进 lib/ 目录并重命名:
<dependencySet>
<outputDirectory>lib</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<includes>
<include>${project.groupId}:${project.artifactId}</include>
</includes>
<outputFileNameMapping>${artifact.artifactId}-${artifact.version}-full.${artifact.extension}</outputFileNameMapping>
</dependencySet>
验证与调试打包结果
执行 mvn clean package 后,检查 target/ 目录下是否生成了预期格式的归档包(如 myapp-1.0-bin.tar.gz)。解压后确认结构是否符合 descriptor 定义。
若结果不符,可启用调试日志:
- 加参数
-X查看 assembly 插件详细执行过程 - 用
<debug>true</debug>在 plugin configuration 中开启内部调试输出 - 临时将
<formats>设为<format>dir</format>,直接生成解压后的文件夹便于快速验证目录结构
不复杂但容易忽略细节,比如 fileMode 在 Windows 下无效、scope 设置不当导致依赖缺失、路径未用 ${project.basedir} 导致跨环境失败等。

















