1. JDK17/JDK21安装后缺失JRE文件夹的解决方案
最近在Windows系统上安装JDK17和JDK21时,发现安装目录下没有熟悉的jre文件夹。这其实是从JDK9开始引入的模块化系统带来的变化,但很多老项目仍然需要独立的JRE环境。下面我将详细介绍如何手动创建JRE文件夹。
1.1 为什么新版JDK不再默认包含JRE
从JDK9开始,Oracle对Java进行了模块化改造。JRE作为运行时环境,现在可以通过jlink工具按需定制生成。这种变化带来了几个优势:
- 减小部署包体积(可以只包含用到的模块)
- 提高安全性(减少不必要的模块暴露)
- 更灵活的运行时配置
但这也导致了一些兼容性问题,特别是:
- 某些旧版工具仍然依赖传统JRE结构
- 部分教学资料和文档尚未更新
- 一些自动化脚本需要调整
1.2 手动生成JRE的详细步骤
以下是经过我多次验证的可靠方法:
定位JDK安装目录:
- 默认路径通常是:
- Windows:
C:\Program Files\Java\jdk-17 - macOS:
/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home - Linux:
/usr/lib/jvm/jdk-17
- Windows:
- 默认路径通常是:
以管理员身份打开命令行:
- Windows:搜索"cmd",右键选择"以管理员身份运行"
- macOS/Linux:使用sudo或切换到root用户
执行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 jre2. 不同场景下的JRE定制方案
2.1 基础桌面应用配置
对于大多数Swing/JavaFX应用,推荐包含这些模块:
bin\jlink.exe --module-path jmods \ --add-modules java.base,java.desktop,java.sql \ --output jre2.2 Web应用服务器配置
Tomcat等服务器需要额外模块:
bin\jlink.exe --module-path jmods \ --add-modules java.base,java.logging,java.xml,java.naming \ --output jre2.3 最小化运行时环境
对于资源受限环境:
bin\jlink.exe --module-path jmods \ --add-modules java.base,java.logging \ --strip-debug --compress=2 \ --output minimal-jre3. 常见问题与解决方案
3.1 权限问题(Windows特有)
错误现象:
Access is denied解决方法:
- 确保使用管理员权限运行CMD
- 检查防病毒软件是否阻止操作
- 尝试在PowerShell中执行:
Start-Process cmd -Verb RunAs3.2 模块找不到错误
错误现象:
Module XXX not found可能原因:
- JDK安装不完整
- 使用了错误的模块名称
解决方案:
- 检查jmods目录是否存在且完整
- 使用以下命令列出所有可用模块:
bin\java --list-modules3.3 生成的JRE过大
优化方案:
- 添加压缩参数:
--compress=2- 移除调试信息:
--strip-debug- 只包含必要模块
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 endlocalLinux/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 jre4.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 ~/.bashrc4.3 与IDE的集成
在IntelliJ IDEA中配置:
- File → Project Structure → SDKs
- 添加JDK(不是JRE)
- 运行时仍然会自动使用模块化系统
Eclipse用户需要注意:
- 2023-06版本后完全支持JDK17+
- 可能需要安装新版JDT插件
5. 版本差异与兼容性
5.1 JDK8与新版JDK对比
| 特性 | JDK8 | JDK17+ |
|---|---|---|
| JRE包含方式 | 安装时自动生成 | 需要手动创建 |
| 模块系统 | 无 | JPMS模块化 |
| 大小 | 较大(完整JRE) | 可定制(更小) |
| 兼容性 | 传统应用 | 需要适配模块化 |
5.2 不同JDK版本的命令差异
JDK9-16:
bin/jlink --module-path jmods --add-modules java.desktop --output jreJDK17+: 新增了--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可以进一步优化:
- 使用AOT编译:
bin/jlink --module-path jmods \ --add-modules java.base \ --output jre-aot \ --launcher hello=java.base/hello.Main- 启用CDS(类数据共享):
bin/java -Xshare:dump- 使用jemalloc替代系统内存分配:
bin/jlink --module-path jmods \ --add-modules jdk.incubator.jextract \ --output jre-perf8. 安全加固方案
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-jre8.2 启用安全限制
- 添加安全策略:
--limit-modules java.base- 设置权限文件:
-Djava.security.manager -Djava.security.policy==/path/to/policy9. 监控与维护
9.1 检查JRE内容
查看生成的JRE信息:
bin/jdeps --list-deps jre/lib/modules9.2 更新模块
当JDK更新时,需要重新生成JRE:
- 备份原有配置
- 运行相同的jlink命令
- 验证新JRE功能
9.3 大小优化对比
不同配置的JRE大小比较:
| 配置方案 | 大小 (MB) | 包含内容 |
|---|---|---|
| 完整JRE | ~200 | 所有模块 |
| 桌面基础版 | ~45 | java.base+java.desktop |
| 最小服务器版 | ~25 | java.base+java.logging |
| 极致精简版 | ~15 | 仅java.base |
10. 实际案例分享
最近为一个遗留系统迁移到JDK17时,遇到了JRE依赖问题。系统原本使用了一些内部API,解决方案是:
- 识别依赖的模块:
bin/jdeps -R --print-module-deps myapp.jar- 生成定制JRE:
bin/jlink --module-path jmods \ --add-modules $(cat modules.txt),jdk.unsupported \ --output myapp-jre- 添加启动脚本:
#!/bin/bash export JAVA_HOME=/path/to/myapp-jre $JAVA_HOME/bin/java -jar myapp.jar这个方案成功将运行时环境从原来的180MB缩减到68MB,同时保持了所有功能正常。