使用 jlink 構建輕巧的自定義JRE

從 JDK 9 開始,Oracle JDK 和 OpenJDK 不再默認包含獨立的 JRE 目錄,而是提供了 jlink 工具(Java 鏈接器),允許你根據需求自定義生成最小化的 JRE(包含必要的模塊)。以下是使用 jlink 生成 JRE 的具體步驟:

生成 JRE 的步驟

1. 查看 JDK 包含的模塊(可選)

首先,可通過 jdepsjava --list-modules 查看 JDK 中可用的模塊,確定需要包含在 JRE 中的核心模塊(如 java.base 是必選模塊):

# 列出 JDK 所有模塊
java --list-modules

包括一些基礎模塊:

  • java.base:核心模塊(String、集合、IO 等),所有 Java 程序都必須依賴,jlink 會自動包含(即使不顯式指定)。
  • java.logging:日志基礎支持(Spring 內部日志適配依賴)。
  • java.sql:若應用使用關系型數據庫(如 MySQL、PostgreSQL),需保留(JDBC 依賴)。
  • java.transaction:事務管理支持(Spring 事務依賴 javax.transaction 相關類)。
  • java.xml:XML 解析支持(Spring 配置文件、XML 格式處理依賴)。
  • java.net.http:若使用 JDK 內置 HTTP 客戶端(如 Spring 的 RestTemplate 底層可能間接用到)。
  • java.management:JMX 支持(Spring Boot Actuator 監控依賴)。
  • jdk.unsupported:部分第三方庫(如 Netty)可能依賴其中的非標準 API(謹慎剔除)。

以下模塊多用于桌面應用、廢棄技術或特定場景,服務器端應用通常不需要:

模塊名用途剔除理由
java.desktop桌面 GUI(Swing、AWT 等)Spring 是服務器端框架,無需 GUI 功能
java.scripting腳本引擎(如 Nashorn)不使用腳本動態執行邏輯時可剔除
java.rmi遠程方法調用(RMI)現代 Spring 應用多用 REST/RPC,極少用 RMI
java.corbaCORBA 協議支持(已廢棄)早已被淘汰,Spring 無相關依賴
java.xml.wsJAX-WS(SOAP 服務)若不開發 SOAP 服務,僅用 REST 可剔除
java.xml.bindJAXB(XML 綁定)現代應用多用 JSON(Jackson),無需 XML 綁定
java.prefs偏好設置 API服務器端應用無需用戶偏好配置
java.awt.headless無頭模式(非 GUI 環境)雖與服務器相關,但 java.desktop 包含它,剔除 java.desktop 即可
jdk.jfr飛行記錄器(性能監控)生產環境若不啟用 JFR,可剔除
jdk.jconsole控制臺監控工具開發工具,生產 JRE 無需包含
jdk.jvisualvm可視化監控工具同上,僅開發用
jdk.management.agentJMX 代理若不暴露遠程 JMX 監控,可剔除

有寫模塊在特定場景下需要,需結合業務判斷:

  • java.naming:JNDI 支持(若應用部署在傳統 Java EE 容器,可能需要;Spring Boot 獨立部署可剔除)。
  • java.security.jgss:GSSAPI 安全認證(若不涉及 Kerberos 等復雜認證,可剔除)。
  • java.net:基礎網絡 API(核心模塊依賴,無法單獨剔除,但部分子功能可忽略)。
  • jdk.net:高級網絡功能(如 HTTP/2),若應用僅用 HTTP/1.1 可剔除。
2. 使用 jlink 生成 JRE

基本命令格式:

jlink --module-path <模塊路徑> --add-modules <需要包含的模塊> --output <生成的JRE目錄>
  • --module-path:指定模塊路徑,通常為 JDK 安裝目錄下的 jmods 文件夾(如 $JAVA_HOME/jmods)。
  • --add-modules:指定需要包含的模塊(多個模塊用逗號分隔,java.base 是必須的)。
  • --output:指定生成的 JRE 存放目錄(如 ./myjre)。

高級選項(可選)

  • 壓縮 JRE 體積:使用 --compress 選項壓縮模塊(0 不壓縮,1 常量字符串壓縮,2 完全壓縮):
    在這里插入圖片描述

    jlink --module-path "$JAVA_HOME/jmods" --add-modules java.base --output myjre --compress 2
    

在較新的 JDK 版本(如 JDK 21+)中,jlink 的 --compress 參數確實已被標記為廢棄(deprecated),并推薦使用更靈活的 --compress-level 參數替代。這一變化是為了統一壓縮相關的參數命名和功能。
–compress-level 參數的功能與原 --compress 一致,但命名更清晰,支持的壓縮級別范圍相同(0-2):
–compress-level 0:不壓縮(默認值)。
–compress-level 1:僅壓縮常量池(字符串等),平衡體積和性能。
–compress-level 2:完全壓縮(包括指令和常量池),體積最小但構建時間稍長。

  • 排除調試信息:使用 --strip-debug 移除調試符號,減小體積:

    jlink --module-path "$JAVA_HOME/jmods" --add-modules java.base --output myjre --strip-debug
    
  • 設置啟動器:使用 --launcher 為應用創建自定義啟動腳本:

    jlink --module-path "$JAVA_HOME/jmods" --add-modules java.base \--launcher myapp=java.base/com.example.MyMain \--output myjre
    

經驗證,構建包含 20 個 modules 的 jre,大小約為 90M,zip 壓縮后為 30M。

注意事項

  • 模塊依賴jlink 會自動包含指定模塊的依賴模塊(如添加 java.desktop 會自動包含其依賴的 java.basejava.xml 等),無需手動添加所有依賴。
  • 應用兼容性:生成 JRE 時需確保包含應用所需的所有模塊,可通過 jdeps -s <你的應用.jar> 分析應用依賴的模塊,再按需添加。
  • 跨平臺支持jlink 只能生成當前平臺(如 Windows x64)的 JRE,跨平臺生成需在對應平臺的 JDK 中執行命令。

通過 jlink 生成的 JRE 是輕量且定制化的,僅包含必要的模塊,適合在生產環境中部署,減少資源占用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94907.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94907.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[IOMMU]面向芯片/SoC驗證工程的IOMMU全景速覽

面向芯片/SoC驗證工程的IOMMU全景速覽 摘要:面向芯片/SoC 驗證工程的 IOMMU 全景速覽:包含基礎概念、主流架構要點(ARM SMMU、Intel VT?d、RISC?V IOMMU),Linux 軟件棧關系,SoC 上的驗證方法(功能、錯誤、性能、系統化流程和覆蓋),以及一個可用的“通用 IOMM…

Jenkins全鏈路教程——Jenkins用戶權限矩陣配置

在企業級CI/CD場景中&#xff0c;“權限混亂”往往比“構建失敗”更致命——測試員誤刪生產流水線、實習生修改關鍵插件配置、多團隊共用賬號導致責任無法追溯……這些問題&#xff0c;99%都能用權限矩陣徹底解決&#xff01;今天&#xff0c;我們不僅會拆解權限矩陣的底層邏輯…

庫函數蜂鳴器的使用(STC8)

使用庫函數控制蜂鳴器&#xff08;STC8&#xff09; 在STC8系列單片機中&#xff0c;可以通過庫函數或直接操作寄存器來控制蜂鳴器。以下是基于STC8庫函數的常用方法&#xff1a; GPIO板蜂鳴器 #include "GPIO.h" #include "Delay.h"void GPIO_config()…

redis8.0.3部署于mac

macOS11因版本過低&#xff0c;安裝redis時&#xff0c;Homebrew和源碼編譯兩種方式都無法成功。將操作系統升級至macOS15再安裝。Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的內存數據庫&#xff0c;遵守 BSD 協議&#xff0c;它提供了一個高性能的鍵值…

【和春筍一起學C++】(三十三)名稱空間的其他特性

目錄 嵌套式名稱空間 拓展——未命名的名稱空間 嵌套式名稱空間 示例代碼1&#xff1a; namespace electronicEquipment {namespace computer{double price 4999.0;string modelNumber;string name;}namespace ElectronicWatch{double price 99.0;string modelNumber;stri…

異步電動機負載運行特性全解析

異步電動機負載運行特性詳解 ——從空載到負載的完整分析一、為什么需要再談“負載運行” 在上一篇《感應電動機空載特性深度剖析》中&#xff0c;我們已經看到&#xff1a;空載時&#xff0c;若定子加額定電壓&#xff0c;轉子轉速 $n \approx n_s$&#xff08;同步轉速&#…

使用 Ansys Discovery 進行動態設計和分析

Ansys Discovery 是一款多功能工具&#xff0c;為創建模型、探索仿真設計和分析解決方案提供了一個單一的交互式工作區。它允許用戶使用直接建模技術創建和修改幾何結構&#xff0c;定義仿真并與結果實時交互。Discovery 支持結構、流體流動、熱和電磁設計&#xff0c;提供直觀…

力扣熱題100-----118.楊輝三角

案例 給定一個非負整數 numRows&#xff0c;生成「楊輝三角」的前 numRows 行。 在「楊輝三角」中&#xff0c;每個數是它左上方和右上方的數的和。 示例 1: 輸入: numRows 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 輸入: numRows 1 輸出: [[1]] 提示: 1 …

NTP /Chrony 網絡時間協議

一、NTP&#xff08;network time protocol&#xff09;網絡時間協議&#xff1a;實現時間同步&#xff0c;讓設備時間與國際標準時間保持一致設備日志、服務日志需要記錄時間分布式系統&#xff08;分布式數據庫、分布式緩存、分布式儲存、消息隊列&#xff09;時間戳&#xf…

VSCode 刷 LeetCode 算法題配置教程

LeetCode 在線刷題地址&#xff1a;https://leetcode-cn.com/ 一、安裝 Node.js 環境 LeetCode 插件依賴 node.js 運行環境&#xff0c;因此必須先安裝&#xff1a; 前往官網下載安裝&#xff1a;https://nodejs.cn/download/下載好的壓縮包解壓&#xff0c;可以看到當前文件…

非常簡單!從零學習如何免費制作一個lofi視頻

想必大家在網上會看到如下類似的音樂頻道&#xff0c;這類頻道都只是上傳簡單的Lo-Fi音樂帶著循環播放的背景就可以賺錢。 那么上面的效果如何實現的呢&#xff1f;今天做一個可以免費制作lo-Fi音樂的教程。 Lo-Fi音樂&#xff1a; Lo-Fi音樂是一種以低保真度和模擬音色為特點…

基于 RAUC 的 Jetson OTA 升級全攻略

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry 基于 RAUC 的 Jetson OTA 升級全攻略 0. 引子&#xff1a;常見問題 在 Jetson 平臺做 OTA 升級時&#xff0c;你可能會問&…

MySQL 主備(Master-Slave)復制 的搭建

一、主備架構簡介 Master&#xff08;主庫&#xff09;&#xff1a;負責處理所有寫操作&#xff08;INSERT/UPDATE/DELETE&#xff09;&#xff0c;并記錄二進制日志&#xff08;binlog&#xff09;。Slave&#xff08;備庫&#xff09;&#xff1a;從主庫拉取 binlog&#xff…

【三個數絕對值排序】2022-10-10

緣由絕對值比較&#xff0c;總是跑不過怎么辦-編程語言-CSDN問答 template <class 形參> inline void 算交換(形參& a, 形參& b){ 形參 ab a - b; a - ab; b ab; } template <class 形參> void 三個升序(形參& a, 形參& b, 形參& c) {if (a…

【LoRA模型訓練】Stable Diffusion LoRA 模型秋葉訓練器詳細教程

一、工具簡介與安裝指南 1.1 秋葉 LoRA 訓練器概述 秋葉 LoRA 訓練器&#xff08;基于 Akegarasu/lora-scripts 項目&#xff09;是針對 Stable Diffusion 模型的輕量化微調工具&#xff0c;通過低秩適應&#xff08;LoRA&#xff09;技術實現高效參數微調。其核心優勢在于&a…

C++2024 年一級

1 單選題 (每題 2 分,共 30 分) 12 ? 題號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 C C D B B D B C C C D C D B D 第 1 題 2024年10?8? &#xff0c;諾貝爾物理學獎“意外地”頒給了兩位計算機科學家約翰霍普菲爾德&#xff08;John J. Hopfield&#xff09;和杰 弗??…

react-window

下面&#xff0c;我們來系統的梳理關于 React 虛擬化列表&#xff1a;react-window 的基本知識點&#xff1a;一、虛擬化列表核心概念 1.1 什么是虛擬化列表&#xff1f; 虛擬化列表&#xff08;也稱為窗口化&#xff09;是一種只渲染當前可見區域列表項的技術&#xff0c;而不…

2025AI顛覆認知!解鎖智能新紀元

清晨的城市還裹著薄霧時&#xff0c;通勤族的手機已經自動規劃好最優路線——避開施工路段、實時更新交通狀況&#xff0c;連早餐店排隊人數都能精準預測。這不是科幻電影里的片段&#xff0c;而是2025年AI深度融入生活的尋常場景。當數字化與智能化浪潮席卷而來&#xff0c;我…

實用Shell高級視頻課程

實用Shell高級視頻課程 Shell三劍客sed我網盤給你分享了「實用Shell高級視頻課程」&#xff0c;點擊鏈接或復制整段內容&#xff0c;打開「APP」即可獲取。/bc3b37jg8i:/鏈接&#xff1a;http://t.cn/A6swtV7u提取碼&#xff1a;ePV4 ???

hive-日期拆分為多行

hive-日期拆分為多行 代碼 SELECT begin_date,date_add(begin_date, tmp.pos),end_date,d_days,tmp.pos,tmp.val FROM (SELECT begin_date,end_date,DATEDIFF(end_date, begin_date) AS d_daysFROM (SELECT 2025-08-01 AS begin_date,2025-08-10 AS end_date) a) b LA…