一、普通jar包和SpringBoot jar包有什么区别?什么是jar包??
(1)什么是Jar包?
定义:
JAR 包(Java Archive) 是 Java 平台标准的归档文件格式,用于将多个 Java 类文件、资源文件(如配置文件、图片等)、元数据(如清单文件)和其他依赖打包成一个独立的压缩文件。它是 Java 生态中代码分发、部署和运行的核心载体。
结构:
- 类文件:包含 Java 类的字节码文件,扩展名为
.class
。这些类文件是 Java 程序的核心,包含了程序的逻辑代码。 - 资源文件:如配置文件(
.properties
、.xml
等)、图片文件(.jpg
、.png
等)、音频文件(.mp3
、.wav
等)。这些资源文件可以被 Java 程序在运行时读取和使用。 - 清单文件:位于
META - INF/MANIFEST.MF
,它是一个文本文件,包含了 JAR 包的元数据信息,如版本号、主类、依赖的库等。清单文件在 JAR 包的使用和管理中起着重要的作用。
JAR 文件本质是一个 ZIP 压缩包,可通过标准 ZIP 工具(如 jar
、unzip
)创建、解压或查看内容
jar tf example.jar # 查看 JAR 内容
unzip -l example.jar # 解压查看结构
(2) 普通jar包和SpringBoot jar包有什么区别
特性 | 普通 JAR | 可执行 JAR(如 Spring Boot) |
---|---|---|
入口类 | 无 Main-Class 或仅为库入口 | 必须指定 Main-Class |
依赖管理 | 依赖需外部配置,需手动配置(如 -cp ) | 所有依赖内嵌在 BOOT-INF/lib |
启动方式 | java -cp example.jar MainClass | java -jar example.jar |
类加载器 | 系统类加载器 | 自定义类加载器(优化资源加载)LaunchedURLClassLoader |
典型场景 | 第三方库、工具类集合 | 独立运行的 Spring Boot 应用 |
服务器依赖 | 需外部服务器部署 WAR | 内嵌服务器,无需外部容器 |
ps: Spring Boot JAR 的特殊结构
example.jar
├── META-INF
│ └── MANIFEST.MF // 包含 Main-Class 和 Start-Class
├── BOOT-INF
│ ├── classes // 项目编译后的类文件
│ └── lib // 所有依赖的第三方库
├── org
│ └── springframework
│ └── boot
│ └── loader // Spring Boot 的类加载器实现
└── ...
二、Maven配置打包/Gradle 配置(使用 org.springframework.boot
插件)打包
(1)Maven
Step 1: 添加插件到 <build>
节点
<build><plugins><plugin><groupId>org.springframework.boot</groupId>```html spring-boot-maven-plugin</artifactId><version>3.1.0</version> <!-- 使用最新版本 --><executions><execution><goals><!-- 绑定插件到 Maven 的打包阶段 --><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>
Step 2: 执行打包命令
mvn clean package
打包结果
- 生成的 JAR 文件位于
target/
目录,名称格式为{project-name}-{version}.jar
。 - 该 JAR 包含:
BOOT-INF/classes
:项目的编译文件。BOOT-INF/lib
:所有依赖的库。- 自定义类加载器(
org/springframework/boot/loader
)。 - 修改后的
MANIFEST.MF
(指定Main-Class: JarLauncher
)。
(2)Gradle
假设项目基于 Gradle 构建,需在 build.gradle
文件中配置:
Step 1: 应用 Spring Boot 插件
plugins {id 'org.springframework.boot' version '3.1.0' // 最新版本id 'io.spring.dependency-management' version '1.1.0'id 'java'
}
Step 2: 执行打包命令
gradle bootJar
打包结果
- 生成的 JAR 文件位于
build/libs/
目录。 - 结构和内容与 Maven 生成的相同。
(3) 插件核心功能(原理)
spring-boot-maven-plugin
或 org.springframework.boot
插件会完成以下操作:
(1) 重新打包(Repackage)
- 将 Maven/Gradle 默认生成的普通 JAR(
*.jar.original
)重新组装为 可执行 JAR。 - 默认 JAR 会被重命名为
*.jar.original
,可执行 JAR 替换为原名称。
(2) 依赖内嵌
- 将所有依赖的第三方库(包括
spring-boot-starter-*
)打包到BOOT-INF/lib
目录。 - 项目自身的编译文件(
.class
和资源)放在BOOT-INF/classes
。
(3) 分层打包(Layered JAR)
从 Spring Boot 2.3+ 开始,插件支持 分层打包,优化 Docker 镜像构建:
- 将依赖分为不同层级(如
dependencies
、spring-boot-loader
、snapshot-dependencies
、application
)。 - 通过
<layers>
配置自定义分层规则(Maven):<plugin><groupId>org.springframework.boot</groupId>```html spring-boot-maven-plugin</artifactId><configuration><layers><enabled>true</enabled><!-- 自定义层配置 --><configuration>${project.basedir}/layers.xml</configuration></layers></configuration> </plugin>
(4) 自定义 MANIFEST.MF
- 修改清单文件,指定
Main-Class: JarLauncher
和Start-Class: 用户的主类
。 - 例如:
Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.example.MyApplication
总结 SpringBoot Jar 实现了:
- 依赖内嵌:将所有依赖和资源打包到单个 JAR。
- 自定义类加载器:通过
JarLauncher
加载嵌套的 JAR 文件。只需简单配置,即可将 Spring Boot 项目快速部署为生产级独立应用。 - 分层优化:提升 Docker 镜像构建的缓存效率。
- 一键运行:无需外部配置,直接通过
java -jar
启动应用。