一、普通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
啟動應用。