- Packaging Spring Boot Applications
Efficient Deployments
-
Efficient Deployments
預設情況下,基於SpringBoot框架開發應用時,構建外掛
spring-boot-maven-plugin
將專案打包為fat jar。
執行如下命令,解壓構建得到的jar檔案。java -Djarmode=tools -jar my-app.jar extract
執行如下命令,使用解壓後的jar檔案,啟動SpringBoot應用。
java -jar my-app/my-app.jar
執行如下命令,檢視工具的幫助。
java -Djarmode=tools -jar my-app.jar help extract
參考資料
- 深入理解SpringBoot載入FatJar原理
- Maven外掛打fatjar的一些技巧
- 打胖瘦jar包的兩種方式(idea與maven外掛),多圖詳解
- 啥?你沒聽過SpringBoot的FatJar?
- maven打包fat-jar注意的問題
- jar的官方文件
- Jar 包簽名
CDS
-
Class Data Sharing
CDS是JVM的特性,有助於縮短Java應用的啟動時間,並減少記憶體佔用量。java -Djarmode=tools -jar my-app.jar extract --destination application cd application java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar my-app.jar java -XX:SharedArchiveFile=application.jsa -jar my-app.jar
-
JVM CDS
-
How To CDS
-
Spring CDS
使用CDS時的注意事項:- 建立
application.jsa
時使用的JVM,和執行Java應用載入application.jsa
時使用的的JVM,二者需要保持一致,即版本號、安裝路徑等需要保持一致。 - Java應用啟動時指定的類路徑,需要使用jar檔案的清單,避免使用目錄或者萬用字元。
- Java應用載入的jar檔案,需要保持一致。
- Java應用載入的jar檔案的時間戳,需要保持一致。
增加JVM選項
-Xlog:class+load:file=cds.log
,透過檢查cds.log
的內容,確認CDS最佳化的效果。
增加JVM選項-Xshare:on
,確認CDS是否正常啟用。 - 建立
-
Builder Configuration
官方文件
- Class Data Sharing
- JEP 310: Application Class-Data Sharing
- JEP 350: Dynamic CDS Archives
- Application Class-Data Sharing
- Dynamic CDS Archive
網頁的錨點有點問題。
參考資料
- JAVA 提速方法——類資料共享 CDS
- 覺得 Java 啟動慢?快來使用 CDS 特性飛速啟動~
- Spring Boot 3.3.0 新特性| 使用 CDS 最佳化啟動時間
AOT
-
Ahead-of-Time Processing With the JVM
AOT和CDS可以同時使用,透過犧牲一部分動態能力,縮短Java應用的啟動時間。
mvn -Pnative package java -Dspring.aot.enabled=true -jar myapplication.jar
相關的註解,比如:
@Profile
@Conditional
@ConditionalOnProperty
-
Ahead-of-Time Processing
-
Understanding Spring Ahead-of-Time Processing
GraalVM
- GraalVM Native Images
基於GraalVM技術,將Java位元組碼處理為平臺相關的程式碼,降低記憶體佔用,縮短應用的啟動時間。 - Introducing GraalVM Native Images
- Developing Your First GraalVM Native Application
- Native Image Compatibility Guide
Checkpoint and Restore
- Checkpoint and Restore With the JVM
Coordinated Restore at Checkpoint (CRaC) is an OpenJDK project that defines a new Java API to allow you to checkpoint and restore an application on the HotSpot JVM.
- JVM Checkpoint Restore
JVM的啟動選項,如下:-XX:CRaCCheckpointTo=PATH
-XX:CRaCRestoreFrom=PATH
參考資料
-
CRaC
-
CRIU程式碼倉庫
Checkpoint/Restore tool
-
CRIU官網。
Welcome to CRIU, a project to implement checkpoint/restore functionality for Linux.
-
BellSoft Liberica JDK
-
Azul JDK
-
org.crac
Container Images
改進容器的打包方式,分離不變和變的元件,加速容器映象的構建程序。
對於開發人員來說,有助於縮短構建時的等待時間,提高生產率。
- Container Images
- Efficient Container Images
- Dockerfiles
- Cloud Native Buildpacks
參考資料
- Java Buildpack Reference
- Layered Jar or War
- Packaging Layered Jar or War