服务器部署Java应用时JRE和JDK有什么区别?

在服务器部署 Java 应用时,JRE(Java Runtime Environment)和 JDK(Java Development Kit)的核心区别在于用途和组成,这直接影响部署决策:

✅ 根本区别

项目 JRE JDK
定位 运行环境(Runtime) 开发工具包(Development + Runtime)
主要用途 仅运行已编译的 Java 程序(.jar/.class 开发、编译、调试、运行 Java 程序(含 javac, javadoc, jdb, jstat 等工具)
是否包含 JVM? ✅ 是(核心组件) ✅ 是(JDK 内置 JRE,含 JVM)
是否包含 javac 编译器? ❌ 否(无法编译 .java 源码) ✅ 是(必须用于编译)
典型体积 较小(约 50–100 MB) 较大(约 200–400+ MB,含文档、源码、工具等)

🚀 服务器部署场景建议

场景 推荐 原因
生产环境部署已打包的 .jar(如 Spring Boot fat jar)或 WAR 包 JRE 足够(更推荐) • 无需编译/调试
• 攻击面更小(无 javacjshell 等非必要工具)
• 占用磁盘/内存更少
• 符合最小权限原则(安全最佳实践)
生产环境需热更新、JVM 诊断、性能调优(如 GC 日志分析、JFR、JMX 监控) 仍可用 JRE,但部分高级工具需 JDK jstat, jinfo, jmap, jstack 等诊断工具在 JDK 的 bin/ 目录下,但 现代 JRE(JDK 11+)已将这些工具移入 JRE(见下方说明)
• 实际上:从 JDK 11 开始,JRE 不再单独发布,官方只提供 JDK;用户需从 JDK 中选择性部署(如仅复制 jre/ 目录或使用 jlink 定制运行时)
CI/CD 构建服务器(打包应用) 必须 JDK • 需要 javac 编译源码
• 需要 jar/jpackage 打包
• 可能需要 jdeps 分析依赖等
开发/测试服务器(需动态编译、热部署、调试) JDK 更合适 • 支持远程调试(-agentlib:jdwp)、JSP 编译(Tomcat)、Groovy/JSR-223 脚本等

⚠️ 重要演进(JDK 11+ 关键变化)

  • 🔹 Oracle 自 JDK 11 起不再提供独立 JRE 下载(JEP 330),JDK 成为唯一分发形式。
  • 🔹 但你可以:
    • 使用 jlink 工具构建自定义最小化运行时镜像(仅含应用所需模块),比传统 JRE 更轻量、更安全;
    • 或从 JDK 目录中提取 jre/ 子目录(旧版 JDK 8/9/10)或直接使用 bin/ + jmods/(JDK 11+);
  • 🔹 jps, jstat, jstack 等工具 在 JDK 11+ 中默认包含在 $JAVA_HOME/bin/,即使你只部署 JDK 的运行时部分(不安装完整 JDK),只要保留 bin/lib/,这些诊断工具依然可用。

✅ 最佳实践总结(生产部署)

项目 推荐做法
首选方案 ▶ 使用 JDK 17/21 LTS(长期支持版),通过 jlink 构建精简运行时,或直接部署完整 JDK(现代云环境磁盘/内存成本低,且工具链统一)
安全加固 ▶ 移除 bin/ 中非必需工具(如 jshell, jjs, rmic);限制 JAVA_HOME 权限;禁用不安全协议(如 RMI 注册表)
容器化(Docker) ▶ 使用官方 eclipse-temurin:17-jre-jammy(实际是 JDK 衍生的精简 JRE 镜像)或 --jre 标签镜像;避免 *-jdk 镜像(除非需编译)
验证命令 bash<br>java -version # 确认运行时<br>java -XshowSettings:properties -version 2>/dev/null | grep java.home<br>which javac # 生产环境应返回空(若存在则需检查)<br>

一句话结论

生产服务器部署已编译的 Java 应用,理论上只需 JRE;但自 JDK 11 起官方不再分发独立 JRE,推荐使用 LTS 版 JDK 并通过 jlink 或容器镜像实现最小化运行时——兼顾安全性、可维护性与工具可用性。

如需具体操作示例(如 jlink 构建 Spring Boot 运行时、Dockerfile 优化、JVM 参数调优),欢迎继续提问! 🌟

未经允许不得转载:CLOUD云枢 » 服务器部署Java应用时JRE和JDK有什么区别?