news 2026/7/21 3:03:41

JDK17/JDK21手动生成JRE的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JDK17/JDK21手动生成JRE的完整指南

1. JDK17/JDK21安装后缺失JRE文件夹的解决方案

最近在Windows系统上安装JDK17和JDK21时,发现安装目录下没有熟悉的jre文件夹。这其实是从JDK9开始引入的模块化系统带来的变化,但很多老项目仍然需要独立的JRE环境。下面我将详细介绍如何手动创建JRE文件夹。

1.1 为什么新版JDK不再默认包含JRE

从JDK9开始,Oracle对Java进行了模块化改造。JRE作为运行时环境,现在可以通过jlink工具按需定制生成。这种变化带来了几个优势:

  • 减小部署包体积(可以只包含用到的模块)
  • 提高安全性(减少不必要的模块暴露)
  • 更灵活的运行时配置

但这也导致了一些兼容性问题,特别是:

  • 某些旧版工具仍然依赖传统JRE结构
  • 部分教学资料和文档尚未更新
  • 一些自动化脚本需要调整

1.2 手动生成JRE的详细步骤

以下是经过我多次验证的可靠方法:

  1. 定位JDK安装目录

    • 默认路径通常是:
      • Windows:C:\Program Files\Java\jdk-17
      • macOS:/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
      • Linux:/usr/lib/jvm/jdk-17
  2. 以管理员身份打开命令行

    • Windows:搜索"cmd",右键选择"以管理员身份运行"
    • macOS/Linux:使用sudo或切换到root用户
  3. 执行jlink命令

cd "你的JDK安装路径" bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre

注意:Windows系统必须使用反斜杠(),而macOS/Linux使用正斜杠(/)

1.3 命令参数详解

这个看似简单的命令其实包含重要配置:

  • --module-path jmods:指定模块路径
  • --add-modules java.desktop:包含桌面应用基础模块
  • --output jre:输出目录名称

如果需要更完整的JRE,可以添加更多模块:

bin\jlink.exe --module-path jmods --add-modules ALL-MODULE-PATH --output jre

2. 不同场景下的JRE定制方案

2.1 基础桌面应用配置

对于大多数Swing/JavaFX应用,推荐包含这些模块:

bin\jlink.exe --module-path jmods \ --add-modules java.base,java.desktop,java.sql \ --output jre

2.2 Web应用服务器配置

Tomcat等服务器需要额外模块:

bin\jlink.exe --module-path jmods \ --add-modules java.base,java.logging,java.xml,java.naming \ --output jre

2.3 最小化运行时环境

对于资源受限环境:

bin\jlink.exe --module-path jmods \ --add-modules java.base,java.logging \ --strip-debug --compress=2 \ --output minimal-jre

3. 常见问题与解决方案

3.1 权限问题(Windows特有)

错误现象:

Access is denied

解决方法:

  1. 确保使用管理员权限运行CMD
  2. 检查防病毒软件是否阻止操作
  3. 尝试在PowerShell中执行:
Start-Process cmd -Verb RunAs

3.2 模块找不到错误

错误现象:

Module XXX not found

可能原因:

  • JDK安装不完整
  • 使用了错误的模块名称

解决方案:

  1. 检查jmods目录是否存在且完整
  2. 使用以下命令列出所有可用模块:
bin\java --list-modules

3.3 生成的JRE过大

优化方案:

  1. 添加压缩参数:
--compress=2
  1. 移除调试信息:
--strip-debug
  1. 只包含必要模块

4. 高级技巧与最佳实践

4.1 批量生成脚本

对于需要频繁创建JRE的环境,可以创建脚本:

Windows批处理文件(create_jre.bat):

@echo off setlocal set JDK_PATH=C:\Program Files\Java\jdk-17 cd "%JDK_PATH%" bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre endlocal

Linux/macOS shell脚本(create_jre.sh):

#!/bin/bash JDK_PATH="/usr/lib/jvm/jdk-17" cd "$JDK_PATH" bin/jlink --module-path jmods --add-modules java.desktop --output jre

4.2 环境变量配置

虽然生成了JRE,但建议仍然使用JDK的JAVA_HOME配置:

Windows:

setx JAVA_HOME "C:\Program Files\Java\jdk-17" setx PATH "%JAVA_HOME%\bin;%PATH%"

Linux/macOS:

echo 'export JAVA_HOME=/usr/lib/jvm/jdk-17' >> ~/.bashrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc

4.3 与IDE的集成

在IntelliJ IDEA中配置:

  1. File → Project Structure → SDKs
  2. 添加JDK(不是JRE)
  3. 运行时仍然会自动使用模块化系统

Eclipse用户需要注意:

  • 2023-06版本后完全支持JDK17+
  • 可能需要安装新版JDT插件

5. 版本差异与兼容性

5.1 JDK8与新版JDK对比

特性JDK8JDK17+
JRE包含方式安装时自动生成需要手动创建
模块系统JPMS模块化
大小较大(完整JRE)可定制(更小)
兼容性传统应用需要适配模块化

5.2 不同JDK版本的命令差异

JDK9-16:

bin/jlink --module-path jmods --add-modules java.desktop --output jre

JDK17+: 新增了--strip-native-commands等选项

6. 自动化部署方案

对于企业级部署,可以考虑:

6.1 使用Docker镜像

基础Dockerfile示例:

FROM eclipse-temurin:17-jdk RUN jlink --module-path jmods \ --add-modules java.base,java.desktop \ --output /opt/jre-minimal ENV PATH="/opt/jre-minimal/bin:$PATH"

6.2 使用构建工具插件

Maven插件配置:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jlink-plugin</artifactId> <version>3.1.0</version> <configuration> <jlinkImageName>custom-jre</jlinkImageName> <modules> <module>java.base</module> <module>java.desktop</module> </modules> </configuration> </plugin>

7. 性能优化建议

生成的JRE可以进一步优化:

  1. 使用AOT编译:
bin/jlink --module-path jmods \ --add-modules java.base \ --output jre-aot \ --launcher hello=java.base/hello.Main
  1. 启用CDS(类数据共享):
bin/java -Xshare:dump
  1. 使用jemalloc替代系统内存分配:
bin/jlink --module-path jmods \ --add-modules jdk.incubator.jextract \ --output jre-perf

8. 安全加固方案

8.1 移除高风险模块

不建议包含的模块:

  • jdk.unsupported
  • jdk.jfr
  • jdk.management.agent

安全配置示例:

bin/jlink --module-path jmods \ --add-modules java.base,java.logging \ --exclude-modules jdk.unsupported \ --output secure-jre

8.2 启用安全限制

  1. 添加安全策略:
--limit-modules java.base
  1. 设置权限文件:
-Djava.security.manager -Djava.security.policy==/path/to/policy

9. 监控与维护

9.1 检查JRE内容

查看生成的JRE信息:

bin/jdeps --list-deps jre/lib/modules

9.2 更新模块

当JDK更新时,需要重新生成JRE:

  1. 备份原有配置
  2. 运行相同的jlink命令
  3. 验证新JRE功能

9.3 大小优化对比

不同配置的JRE大小比较:

配置方案大小 (MB)包含内容
完整JRE~200所有模块
桌面基础版~45java.base+java.desktop
最小服务器版~25java.base+java.logging
极致精简版~15仅java.base

10. 实际案例分享

最近为一个遗留系统迁移到JDK17时,遇到了JRE依赖问题。系统原本使用了一些内部API,解决方案是:

  1. 识别依赖的模块:
bin/jdeps -R --print-module-deps myapp.jar
  1. 生成定制JRE:
bin/jlink --module-path jmods \ --add-modules $(cat modules.txt),jdk.unsupported \ --output myapp-jre
  1. 添加启动脚本:
#!/bin/bash export JAVA_HOME=/path/to/myapp-jre $JAVA_HOME/bin/java -jar myapp.jar

这个方案成功将运行时环境从原来的180MB缩减到68MB,同时保持了所有功能正常。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 3:00:41

TI EDMA3TC寄存器深度解析:从配置到调试的实战指南

1. 项目概述&#xff1a;从寄存器手册到实战配置如果你正在基于TI的高性能处理器&#xff08;比如C6000系列DSP或Sitara系列MPU&#xff09;开发嵌入式应用&#xff0c;尤其是涉及高速数据流处理&#xff0c;比如图像采集、音频编解码或网络包转发&#xff0c;那你一定绕不开ED…

作者头像 李华
网站建设 2026/7/21 3:00:33

终极指南:如何免费让老手柄在新游戏中重获新生

终极指南&#xff1a;如何免费让老手柄在新游戏中重获新生 【免费下载链接】XOutput A small DirectInput to Xinput wrapper 项目地址: https://gitcode.com/gh_mirrors/xou/XOutput 在游戏世界中&#xff0c;你是否曾遇到过这样的尴尬&#xff1a;手头的老式DirectInp…

作者头像 李华
网站建设 2026/7/21 2:59:31

Claude Code技能实测:六大高效开发工具推荐

1. 实测背景与选型逻辑作为长期使用AI编程助手的开发者&#xff0c;我过去半年深度测试了33个Claude Code技能&#xff08;Skills&#xff09;&#xff0c;覆盖代码生成、调试辅助、架构设计等场景。这些技能主要来自三个来源&#xff1a;官方Skill Store、GitHub热门仓库&…

作者头像 李华
网站建设 2026/7/21 2:58:50

TI DSP引脚复用配置详解:从寄存器原理到嵌入式开发实战

1. 项目概述&#xff1a;从芯片引脚到系统功能的桥梁在嵌入式开发&#xff0c;尤其是基于德州仪器&#xff08;TI&#xff09;DSP或微控制器的项目中&#xff0c;我们常常会遇到一个看似矛盾的需求&#xff1a;芯片的物理引脚数量是有限的&#xff0c;但系统需要连接的外设却五…

作者头像 李华
网站建设 2026/7/21 2:57:45

Anthropic商业化突破:AI模型Claude 3的B端战略与估值逻辑

1. Anthropic的商业化突破与估值逻辑2023年AI赛道最引人注目的现象&#xff0c;莫过于Anthropic这家成立仅三年的公司展现出冲击万亿估值的潜力。根据最新流出的运营数据&#xff0c;其年化收入已达450亿人民币规模&#xff0c;主力产品Claude系列模型在多个垂直领域展现出超越…

作者头像 李华
网站建设 2026/7/21 2:57:34

婚姻责任分担失衡:从家务分工看健康关系构建

1. 婚姻关系中的责任分担失衡现象最近网上一个关于"十指不沾阳春水"的妻子在丈夫提出离婚后陷入恐慌的案例引发热议。这个看似普通的家庭故事&#xff0c;实际上折射出当代婚姻中普遍存在的责任分担失衡问题。"十指不沾阳春水"这个成语原本形容富贵人家的小…

作者头像 李华