1. JDK安装后为何缺少JRE文件夹在JDK 17和21版本中Oracle对Java的打包方式进行了重大调整。传统JDK安装包会同时包含开发工具JDK和运行时环境JRE两个独立目录但从JDK 11开始这种结构发生了变化。1.1 模块化系统的引入Java 9引入的模块化系统Jigsaw项目是这一变化的根本原因。模块化后JRE不再是独立实体而是作为JDK的一个子集存在。具体表现为JDK镜像现在包含完整的Java SE规范实现运行时环境JRE的功能已集成到JDK的jmods目录中通过jlink工具可以按需创建自定义运行时镜像1.2 实际目录结构对比以Windows平台为例传统JDK 8和现代JDK 17/21的目录结构差异明显JDK 8典型结构 ├── jdk1.8.0_291 │ ├── bin # 开发工具 │ ├── jre # 独立运行时 │ └── lib # 类库 └── jre1.8.0_291 # 独立安装的JRE JDK 17/21典型结构 ├── jdk-17.0.10 │ ├── bin # 开发工具 │ ├── conf # 配置文件 │ ├── include # 本地头文件 │ ├── jmods # 模块化组件 │ └── legal # 许可信息2. 手动生成JRE文件夹的三种方法2.1 使用jlink工具创建精简运行时这是Oracle官方推荐的方式可以生成完全符合需求的JRE# 进入JDK安装目录 cd C:\Program Files\Java\jdk-21.0.10 # 创建最小化JRE约40MB bin\jlink.exe --module-path jmods --add-modules java.base --output jre-minimal # 创建标准JRE包含常用模块 bin\jlink.exe --module-path jmods \ --add-modules java.base,java.desktop,java.sql \ --output jre-standard关键参数说明--module-path指定模块源路径--add-modules选择要包含的模块--output输出目录名称2.2 通过安装程序生成传统JRE虽然官方不推荐但仍可通过以下步骤生成传统JRE以管理员身份打开命令提示符执行以下命令cd C:\Program Files\Java\jdk-21.0.10 bin\jlink.exe --module-path jmods --add-modules ALL-MODULE-PATH --output jre-full这会在JDK目录下创建完整的jre-full文件夹2.3 复制法创建兼容性JRE适用于老旧软件某些遗留系统可能严格要求传统JRE结构可以这样处理# 创建基础目录结构 mkdir jre-legacy mkdir jre-legacy\bin mkdir jre-legacy\lib # 复制必要文件 xcopy /s /y bin\server jre-legacy\bin\server xcopy /s /y lib\* jre-legacy\lib\ copy bin\java.exe jre-legacy\bin\ copy bin\javaw.exe jre-legacy\bin\3. 环境变量配置的注意事项3.1 标准配置方案无论采用哪种JRE生成方式环境变量都应指向JDK目录JAVA_HOMEC:\Program Files\Java\jdk-21.0.10 PATH%JAVA_HOME%\bin;...3.2 特殊场景配置如果某些应用必须使用独立JRE路径可以这样设置# 使用jlink生成的JRE JRE_HOME%JAVA_HOME%\jre-standard # 使用复制法生成的JRE JRE_HOME%JAVA_HOME%\jre-legacy3.3 常见配置误区路径冲突避免同时配置JAVA_HOME和JRE_HOME指向不同版本符号链接问题Windows快捷方式不是真正的符号链接建议使用完整路径系统变量vs用户变量开发环境建议配置系统变量4. 验证与问题排查4.1 基础验证步骤# 验证Java版本 java -version # 验证编译器 javac -version # 检查模块系统 java --list-modules4.2 典型问题解决方案问题1找不到或无法加载主类可能原因类路径未正确设置模块路径冲突解决方案# 明确指定类路径 java -cp bin;lib/* com.example.Main # 或指定模块路径 java -p mods -m module/package.Main问题2jlink生成的JRE无法运行GUI程序缺少必要模块# 重新生成包含GUI模块的JRE jlink --module-path jmods \ --add-modules java.desktop,java.base \ --output jre-with-gui问题3与旧版JDK共存时的冲突推荐处理方式卸载所有旧版Java使用工具管理多版本# 使用jenv工具需先安装 jenv add /path/to/jdk17 jenv add /path/to/jdk21 jenv global 215. 高级应用场景5.1 创建平台专属运行时针对特定硬件优化jlink --module-path jmods \ --add-modules java.base,java.desktop \ --output jre-arm64 \ --vmserver \ --strip-debug \ --no-header-files \ --no-man-pages5.2 构建Docker镜像优化Dockerfile示例FROM eclipse-temurin:21-jdk-jammy AS builder RUN jlink --module-path $JAVA_HOME/jmods \ --add-modules java.base,java.logging \ --strip-debug \ --no-man-pages \ --output /opt/jre-minimal FROM ubuntu:22.04 COPY --frombuilder /opt/jre-minimal /opt/jre ENV PATH/opt/jre/bin:$PATH5.3 性能调优建议精简运行时大小jlink --compress2 --no-header-files ...预生成类数据共享存档java -Xshare:dump -XX:UseAppCDS选择适合的VM实现jlink --vmclient # 对GUI应用更友好 jlink --vmserver # 对服务端应用更优对于需要兼容传统部署方式的场景建议在持续集成流程中加入jlink步骤自动生成符合要求的JRE分发包。现代Java应用更推荐直接使用JDK内置的运行时能力而非维护独立的JRE副本。