springboo打包--Maven 打包

本文对 Spring Boot 服务应用的打包机制进行一个基础的介绍与说明,包括以下内容:

  • Spring Boot 默认是如何完成打包的
  • 可执行 Jar 的内部结构是什么
  • 打包过程中各 Maven 插件的职责边界
  • 生产环境中推荐的基础打包规范

一、默认打包方式

1.1 默认构建工具

在 Maven 体系下,主要依赖 spring-boot-maven-plugin 实现打包功能。

xml 复制代码
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

该插件负责将普通 Java Jar 重新打包(repackage) 为可直接运行的 Jar。


1.2 标准构建命令

bash 复制代码
mvn clean package

构建完成后,在模块的 target/ 目录下生成打包产物。


二、打包结果说明

2.1 target 目录结构

text 复制代码
target/
 ├─ xxx.jar
 ├─ xxx.jar.original
 └─ classes/
  • xxx.jar :最终部署使用的可执行 Jar
  • xxx.jar.original :未 repackage 前的原始 Jar,一般无需使用
  • classes/ :编译后的 class 与资源文件

2.2 可执行 Jar(Fat Jar)

Spring Boot 默认生成的是 Fat Jar,本质上是一个压缩包,内置了所有依赖,不依赖外部 lib 目录。也就是说只需 JDK 就可以运行完整服务。


三、Jar包 结构分析

典型 Spring Boot Jar 结构如下:

text 复制代码
xxx.jar
 ├─ BOOT-INF/
 │   ├─ classes/      # 应用代码与配置文件
 │   └─ lib/          # 所有依赖 Jar
 ├─ META-INF/
 └─ org/springframework/boot/loader
  • BOOT-INF/classes
    • 业务代码
    • application.yml / properties
    • 静态资源
  • BOOT-INF/lib
    • Maven 依赖的所有三方 Jar
  • boot loader
    • Spring Boot 自定义类加载器-也就是编译后的class文件

四、Spring Boot Jar 的运行方式

4.1 标准启动命令

bash 复制代码
java -jar xxx.jar

4.2 常见运行参数

bash 复制代码
java -jar xxx.jar \
  --spring.profiles.active=prod \
  --server.port=8080

五、Jar 命名与版本管理建议

5.1 默认命名

text 复制代码
service-order-1.0.0-SNAPSHOT.jar

6.2 自定义名称

可以在 pom.xml 中指定:

xml 复制代码
<build>
    <finalName>${project.artifactId}</finalName> # ${project.artifactId} 单独定义
</build>

打包生成:

text 复制代码
指定名称.jar

六、pom.xml 配置示例

xml 复制代码
<build>
    <!-- 生成的 jar 文件名稳定,不带版本号 -->
    <finalName>${project.artifactId}</finalName>

    <plugins>
        <!-- Spring Boot 打包插件,生成可执行 Fat Jar -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.0.RELEASE</version>
        </plugin>
    </plugins>
</build>

配置说明

  1. finalName:控制生成的 Jar 名称
  2. spring-boot-maven-plugin:将普通 Jar 打包为可执行 Fat Jar
相关推荐
蜗牛互联网27 分钟前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff44 分钟前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈
Shaoshing1 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
dd聊技术1 小时前
Prompt 从代码常量搬进数据库:改一句话,不用再发一次版
java·后端
ly76891 小时前
Spring Data MongoDB 批量写入实践:BulkOperations 批大小与写关注权衡
java·mongodb·spring·批量写入·bulkoperations·写关注·mongotemplate
TAKETODAY1 小时前
Netty 是怎么把 HTTP 请求交给 MVC 的?一个请求的完整链路
java·netty
蚰蜒螟1 小时前
从内核启动到 Java NIO:一次 socket accept 的源码串联之旅
java·python·nio
会编程的吕洞宾2 小时前
Spring AI 2.0 自校正结构化输出实战:让大模型稳定吐出合格 JSON
java·人工智能·后端·spring
bmxy小明同学2 小时前
2026-10-09-token与成本
java·前端·数据库
微笑的曙光3 小时前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序