从 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…