文章目录
- 一、Maven打包核心插件解析
-
- [1. maven-compiler-plugin:编译的"基石"](#1. maven-compiler-plugin:编译的“基石”)
- [2. maven-jar-plugin:基础JAR打包工具](#2. maven-jar-plugin:基础JAR打包工具)
- [3. spring-boot-maven-plugin:Spring Boot专属打包神器](#3. spring-boot-maven-plugin:Spring Boot专属打包神器)
- [4. maven-shade-plugin:进阶版Fat JAR工具](#4. maven-shade-plugin:进阶版Fat JAR工具)
- [5. maven-assembly-plugin:灵活的打包工具](#5. maven-assembly-plugin:灵活的打包工具)
- 6、核心插件对比表
- 二、Maven打包核心模式详解
-
- [模式1:单模块Spring Boot Fat JAR(全量打包)](#模式1:单模块Spring Boot Fat JAR(全量打包))
- [模式2:多模块父工程聚合打包Fat JAR](#模式2:多模块父工程聚合打包Fat JAR)
- 模式3:多模块混合分离打包(业务内置,第三方外置)
- 模式4:多模块全分离打包(所有依赖外置)
- 三、四种打包模式核心对比
- 四、实战选型建议
- 五、总结
系列文章:
解惑Maven插件关系:为什么有时只用一个插件,也能打出Fat JAR?
Maven作为Java项目的核心构建工具,打包是其最核心的能力之一。不同的业务场景(单模块微服务、多模块企业应用、频繁迭代的大型项目)需要不同的打包策略,而灵活运用Maven插件则是实现各类打包需求的关键。本文将从核心插件解析入手,系统讲解Maven打包的底层逻辑,并结合实战场景拆解Fat JAR、分离打包等主流模式,覆盖从单模块到多模块的全场景应用。
一、Maven打包核心插件解析
Maven本身仅提供基础的构建生命周期(clean、compile、package等),具体的打包逻辑完全依赖插件实现。下面先吃透5个最核心的打包插件,这是理解所有打包策略的基础。
1. maven-compiler-plugin:编译的"基石"
核心作用
唯一职责是将Java源码编译为class字节码文件,是所有打包流程的前置步骤,没有编译就没有后续的打包操作。
核心配置项
source/target:指定源码编译的Java版本(如1.8),避免版本不兼容;encoding:指定源码编码(如UTF-8),解决中文乱码;fork:是否启用独立进程编译,提升编译稳定性(尤其Spring Boot项目)。
典型配置
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version> <!-- 推荐稳定版本 -->
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
<fork>true</fork> <!-- 独立进程编译 -->
</configuration>
</plugin>
适用场景
所有Java项目必备,无例外。
2. maven-jar-plugin:基础JAR打包工具
核心作用
Maven原生的JAR打包插件,负责将编译后的class文件、资源文件打包为普通JAR包(仅包含项目自身代码,不包含任何第三方依赖)。
核心能力
- 生成标准的JAR文件;
- 配置
MANIFEST.MF文件(指定主类、类路径、依赖前缀等); - 控制JAR包的包含/排除内容。
关键配置(分离打包核心)
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath> <!-- 自动添加类路径 -->
<classpathPrefix>lib/</classpathPrefix> <!-- 依赖文件前缀(指向外部lib目录) -->
<mainClass>com.example.Application</mainClass> <!-- 程序入口类 -->
<useUniqueVersions>false</useUniqueVersions> <!-- 依赖名不带版本号,简化管理 -->
</manifest>
</archive>
</configuration>
</plugin>
适用场景
- 生成普通JAR包(仅自身代码);
- 分离打包时配置
MANIFEST.MF,让JAR能找到外部依赖。
3. spring-boot-maven-plugin:Spring Boot专属打包神器
核心作用
Spring Boot项目的核心插件,解决了普通JAR无法直接运行的问题,核心能力有:
- 生成可执行Fat JAR(内置所有依赖+Spring Boot启动器);
- 支持
devtools热部署(需配置fork=true); - 过滤/包含指定依赖(实现混合分离打包);
- 处理
system范围的本地依赖打包。
核心原理
将普通JAR重新打包(repackage目标),在JAR内部生成:
BOOT-INF/classes:项目自身代码;BOOT-INF/lib:所有第三方依赖;META-INF/MANIFEST.MF:包含Spring Boot启动类和类加载逻辑。
典型配置(Fat JAR)
xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version> <!-- 与Spring Boot版本一致 -->
<configuration>
<fork>true</fork> <!-- 支持devtools热部署 -->
<includeSystemScope>true</includeSystemScope> <!-- 包含system范围依赖 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 核心目标:生成可执行JAR -->
</goals>
</execution>
</executions>
</plugin>
适用场景
所有Spring Boot项目(单模块/多模块),是生成可执行JAR的首选插件。
4. maven-shade-plugin:进阶版Fat JAR工具
核心作用
通用的Fat JAR打包插件(非Spring Boot专属),核心能力:
- 将项目代码+所有依赖打包为单个JAR;
- 解决依赖冲突(重命名包名,如
com.google.guava→com.example.shaded.guava); - 合并同名资源文件(如
META-INF/spring.handlers); - 剔除冗余依赖,精简包体积。
典型配置
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<mainClass>com.example.Application</mainClass> <!-- 指定主类 -->
<!-- 剔除冗余依赖 -->
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
适用场景
- 非Spring Boot项目的Fat JAR打包;
- 存在依赖冲突的复杂项目;
- 需要定制化Fat JAR内容的场景。
5. maven-assembly-plugin:灵活的打包工具
核心作用
最灵活的打包插件,支持生成JAR、ZIP、TAR、WAR等多种格式,核心能力:
- 自定义打包内容(包含/排除指定文件/依赖);
- 支持多模块聚合打包;
- 生成包含依赖的"组装包"(如ZIP包内含JAR+lib+启动脚本)。
典型配置(生成Fat JAR)
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Application</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef> <!-- 内置所有依赖 -->
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
适用场景
- 需要生成非JAR格式的打包产物(如ZIP部署包);
- 高度定制化的打包需求(如包含配置文件、脚本、文档)。
6、核心插件对比表
| 插件名称 | 核心定位 | 核心优势 | 适用场景 |
|---|---|---|---|
| maven-compiler-plugin | 源码编译 | 基础必备,稳定 | 所有Java项目 |
| maven-jar-plugin | 普通JAR打包 | 轻量,支持MANIFEST配置 | 生成普通JAR、分离打包配置 |
| spring-boot-maven-plugin | Spring Boot可执行JAR | 开箱即用,适配Spring Boot | Spring Boot项目Fat JAR/分离打包 |
| maven-shade-plugin | 通用Fat JAR | 解决依赖冲突,定制化强 | 非Spring Boot项目Fat JAR、复杂依赖 |
| maven-assembly-plugin | 多格式灵活打包 | 支持ZIP/TAR,自定义性强 | 生成部署包、多格式打包 |
这 5 个插件并非孤立存在,而是围绕 Maven 的构建生命周期(clean、validate、compile、package 等)形成 "分工协作 + 层级依赖" 的关系,用一张图能清晰说明:

二、Maven打包核心模式详解
基于上述插件,Maven有4种主流打包模式,覆盖从单模块到多模块的所有场景。先明确核心概念:
- 普通JAR:仅包含项目自身代码,无依赖,无法直接运行;
- Fat JAR(胖JAR) :包含项目代码+所有依赖,可直接
java -jar运行; - 分离打包:项目代码与依赖分离(JAR+lib目录),需指定类路径运行。
模式1:单模块Spring Boot Fat JAR(全量打包)
核心定义
单模块项目中,通过spring-boot-maven-plugin将项目代码+所有第三方依赖打包为单个可执行JAR,是Spring Boot最基础的打包方式。
核心优势
- 部署极简:仅需上传一个JAR文件,
java -jar xxx.jar即可运行; - 无环境依赖:内置所有依赖,避免服务器环境缺失依赖的问题;
- 适配Spring Boot生态:自动处理Spring Boot的类加载、启动逻辑。
完整配置
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spring-boot-single</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
<relativePath/>
</parent>
<properties>
<java.version>8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!-- Spring Boot Fat JAR插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
<configuration>
<fork>true</fork> <!-- 支持devtools -->
<includeSystemScope>true</includeSystemScope> <!-- 包含system依赖 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 生成可执行JAR -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
打包流程
- 执行
mvn clean package; maven-compiler-plugin编译源码为class文件;spring-boot-maven-plugin先生成普通JAR,再执行repackage目标重新打包为Fat JAR;- 最终在
target目录生成可执行JAR(如spring-boot-single.jar)。
适用场景
- 单模块Spring Boot微服务;
- 小型工具类项目;
- 追求部署便捷性的场景。
优缺点
| 优点 | 缺点 |
|---|---|
| 部署简单(单文件) | 包体积大 |
| 无环境依赖 | 增量更新成本高(全量替换) |
| 适配Spring Boot生态 | 依赖冲突需额外处理 |
模式2:多模块父工程聚合打包Fat JAR
核心定义
多模块项目中,父工程(packaging=pom)负责聚合子模块、统一配置,核心业务子模块(如admin)通过继承父配置生成Fat JAR,最终输出单个可执行JAR。
核心逻辑
- 父工程:仅做"模块聚合+配置继承",不生成JAR;
- 子模块:核心业务模块(如
admin)依赖其他子模块(如common、system),并配置spring-boot-maven-plugin生成包含所有子模块+第三方依赖的Fat JAR。
项目结构
multi-module-fatjar/
├── pom.xml(父工程)
├── demo-common/(通用模块)
│ └── pom.xml
├── demo-system/(系统模块)
│ └── pom.xml
└── demo-admin/(核心业务模块,生成Fat JAR)
└── pom.xml
完整配置
1. 父工程pom.xml
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>multi-module-fatjar</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<!-- 聚合子模块 -->
<modules>
<module>demo-common</module>
<module>demo-system</module>
<module>demo-admin</module>
</modules>
<!-- 统一管理依赖版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.18</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 子模块版本管理 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>demo-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>demo-system</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<java.version>8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 统一配置插件(子模块继承) -->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2. 核心业务模块(demo-admin)pom.xml
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.example</groupId>
<artifactId>multi-module-fatjar</artifactId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-admin</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- 依赖其他子模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>demo-common</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>demo-system</artifactId>
</dependency>
<!-- Spring Boot核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 继承父工程的编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<!-- 生成Fat JAR -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
<configuration>
<fork>true</fork>
<includeSystemScope>true</includeSystemScope>
<!-- 指定主类 -->
<mainClass>com.example.demo.admin.DemoAdminApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
打包流程
- 在父工程根目录执行
mvn clean package; - Maven递归编译所有子模块(
demo-common→demo-system→demo-admin); demo-admin模块的spring-boot-maven-plugin将自身代码+依赖的子模块+第三方依赖打包为Fat JAR;- 最终在
demo-admin/target目录生成可执行JAR(如demo-admin.jar)。
适用场景
- 多模块Spring Boot项目;
- 希望输出单个可执行JAR,简化部署;
- 子模块版本统一管理的场景。
优缺点
| 优点 | 缺点 |
|---|---|
| 多模块统一管理 | 包体积大(包含所有子模块) |
| 部署简单(单文件) | 子模块变更需全量重新打包 |
| 依赖版本统一 | 编译耗时较长 |
模式3:多模块混合分离打包(业务内置,第三方外置)
核心定义
差异化处理依赖的打包方式:
- 内部业务模块(如
common、system):内置到主JAR(频繁更新,便于替换); - 第三方依赖(如Spring、MyBatis):外置到
lib目录(稳定,无需频繁更新)。
这是若依、RuoYi-Vue等主流开源框架的生产环境标配。
完整配置(父工程)
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>multi-module-mix</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>yq-common</module>
<module>yq-framework</module>
<module>yq-system</module>
<module>yq-admin</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.18</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>yq-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>yq-framework</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>yq-system</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<java.version>8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!-- 1. Spring Boot插件:仅内置内部业务模块 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
<configuration>
<layout>JAR</layout>
<includeSystemScope>true</includeSystemScope>
<includes>
<include>
<groupId>com.example</groupId>
<artifactId>yq-common</artifactId>
</include>
<include>
<groupId>com.example</groupId>
<artifactId>yq-framework</artifactId>
</include>
<include>
<groupId>com.example</groupId>
<artifactId>yq-system</artifactId>
</include>
</includes>
<mainClass>com.example.yq.admin.YqAdminApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 2. 配置MANIFEST,指向外部lib -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.example.yq.admin.YqAdminApplication</mainClass>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 3. 拷贝第三方依赖到lib目录(排除内部模块) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
<!-- 排除内部业务模块,不拷贝到lib -->
<excludeGroupIds>com.example</excludeGroupIds>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
打包流程
- 执行
mvn clean package,编译所有子模块; maven-dependency-plugin拷贝所有第三方依赖到target/lib(排除内部业务模块);maven-jar-plugin打包主JAR,配置MANIFEST.MF指向lib目录;spring-boot-maven-plugin过滤依赖,仅将内部业务模块内置到主JAR;- 最终产物:
target/yq-admin.jar(含业务模块) +target/lib(含第三方依赖)。
运行方式
bash
# 进入target目录
cd yq-admin/target
# 运行(指定类路径包含lib目录)
java -jar yq-admin.jar
适用场景
- 若依类多模块企业应用;
- 业务模块频繁迭代,第三方依赖稳定的场景;
- 追求增量更新效率的生产环境。
优缺点
| 优点 | 缺点 |
|---|---|
| 增量更新成本低(仅替换主JAR) | 部署需同时管理JAR+lib |
| 包体积适中 | 需确保lib目录完整 |
| 业务迭代便捷 | 配置相对复杂 |
模式4:多模块全分离打包(所有依赖外置)
核心定义
极致轻量化打包:主JAR仅包含启动类和少量配置,所有依赖(内部模块+第三方库)全部外置到lib目录。
核心配置(基于模式3修改)
xml
<!-- 仅修改关键部分,其余同模式3 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
<configuration>
<layout>JAR</layout>
<includeSystemScope>true</includeSystemScope>
<!-- 排除所有依赖,主JAR仅保留启动类 -->
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
<mainClass>com.example.yq.admin.YqAdminApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
<!-- 不排除任何依赖,所有内容都拷贝到lib -->
</configuration>
</execution>
</executions>
</plugin>
打包流程
- 编译所有子模块;
maven-dependency-plugin拷贝所有依赖 (内部模块+第三方库)到target/lib;maven-jar-plugin打包轻量主JAR(仅启动类);spring-boot-maven-plugin排除所有依赖,确保主JAR无内置内容;- 最终产物:
target/yq-admin.jar(仅启动类) +target/lib(含所有依赖)。
适用场景
- 大型多模块项目;
- 业务模块、基础模块均频繁迭代的场景;
- 追求极致轻量化,需单独更新某个子模块的场景。
优缺点
| 优点 | 缺点 |
|---|---|
| 增量更新成本极低(替换单个模块JAR) | 部署复杂度最高 |
| 主JAR体积极小 | 易出现依赖缺失问题 |
| 模块更新独立 | 配置最复杂 |
三、四种打包模式核心对比
| 对比维度 | 模式1:单模块Fat JAR | 模式2:多模块Fat JAR | 模式3:混合分离打包 | 模式4:全分离打包 |
|---|---|---|---|---|
| 打包产物 | 单个可执行JAR | 单个可执行JAR | 主JAR+lib(第三方) | 主JAR+lib(所有) |
| 依赖存放 | 全部内置 | 全部内置 | 业务内置/第三方外置 | 全部外置 |
| 部署复杂度 | 极低 | 极低 | 中等 | 高 |
| 增量更新成本 | 高 | 高 | 低 | 极低 |
| 包体积 | 大 | 大 | 适中 | 主JAR极小 |
| 核心插件 | spring-boot-maven-plugin | spring-boot-maven-plugin | 三者组合 | 三者组合 |
| 典型应用 | 单模块微服务 | 多模块微服务 | 若依类企业应用 | 大型迭代项目 |
四、实战选型建议
- 小型项目/微服务:优先选模式1(单模块Fat JAR)或模式2(多模块Fat JAR),部署简单,降低运维成本;
- 中大型企业应用:优先选模式3(混合分离打包),兼顾更新效率和部署便捷性,是生产环境最优解;
- 超大型频繁迭代项目:选模式4(全分离打包),极致轻量化,适合模块化管理的大型系统;
- 非Spring Boot项目 :Fat JAR用
maven-shade-plugin,分离打包用maven-jar-plugin + maven-dependency-plugin。
五、总结
- 核心插件是基础 :
maven-compiler-plugin是编译基石,spring-boot-maven-plugin是Spring Boot打包核心,maven-jar-plugin + maven-dependency-plugin是分离打包的关键; - 打包模式看场景:Fat JAR胜在部署简单,分离打包胜在更新高效,需根据项目规模和迭代频率选择;
- 多模块核心逻辑:父工程仅做聚合和配置继承,可执行JAR由核心业务子模块生成,插件配置优先在父工程统一管理,子模块继承使用。