奋斗
努力

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

云计算

在服务器部署 Java 应用时,JRE(Java Runtime Environment)和 JDK(Java Development Kit)的核心区别在于用途和包含内容。选择哪一个取决于你的具体部署场景:


✅ 1. JRE(Java 运行时环境)

  • 定位:仅用于运行已编译的 Java 程序(.class.jar 文件)。
  • 包含内容
    • JVM(Java 虚拟机)——真正执行字节码的引擎;
    • 核心类库(如 java.lang, java.util, java.io 等);
    • 运行时支持工具(如 java, jexec, keytool, jjs 等基础命令);
    • 不包含编译器(javac)、调试器(jdb)、打包工具(jar, javadoc)、性能分析工具(jstat, jstack, jmap)等开发相关组件
  • 适用场景(推荐用于生产环境)
    • 应用已提前在开发/构建环境编译完成(如 Maven 打包生成的 app.jar);
    • 服务器只需运行该 JAR/WAR(如 Spring Boot 的 fat jar、Tomcat 中部署的 WAR);
    • 追求最小化、安全性、资源占用低(JRE 体积更小,攻击面更小)。

✅ ✅ 最佳实践:生产服务器应优先安装 JRE(或更现代的 JRE 替代品,见下文)


✅ 2. JDK(Java 开发工具包)

  • 定位:面向开发与构建,是 JRE + 开发工具的超集。
  • 包含内容
    • ✅ 完整的 JRE(含 JVM 和类库);
    • javac(Java 编译器);
    • javadoc, jar, jdeps, jlink, jpackage 等构建/打包工具;
    • ✅ 调试与诊断工具:jdb, jstat, jstack, jmap, jconsole, jvisualvm(部分版本);
    • ✅ 源代码(src.zip)、头文件(JNI 开发用)、Java 本地接口(JNI)支持等。
  • 适用场景
    • 服务器需动态编译 Java 代码(如某些老式 JSP 容器、Groovy/Scala 脚本热编译、或自定义类加载+编译场景);
    • 需要在服务器端进行故障诊断与性能调优(如实时 dump 堆栈、内存快照、GC 分析);
    • 构建环境(CI/CD Agent、Docker 构建阶段);
    • ⚠️ 不推荐作为生产运行时(除非有明确需求),因为:
    • 体积更大(多出 50–100MB+);
    • 包含非必要组件,增加安全风险(如 jcmd 可被滥用);
    • 不符合“最小权限”原则。

🔍 关键补充说明(重要!)

方面 说明
JDK 自带 JRE? ✅ 是的 —— JAVA_HOME/jre/(旧版 JDK 8)或 JAVA_HOME/bin/java 直接指向运行时(JDK 9+ 移除了独立 jre/ 目录,但 java 命令仍可用)。JDK 本质就是“可运行 + 可开发”的完整套件。
现代 Java(JDK 11+)的“JRE”去哪了? ❗ Oracle 和 OpenJDK 自 JDK 11 起正式移除了独立 JRE 下载。官方推荐:
• 生产环境 → 使用 JDK + jlink 构建自定义最小运行时镜像(仅含应用所需模块);
• 或直接使用 JDK 并只运行 java 命令(无 javac 等工具不会自动启用);
• 第三方提供轻量 JRE(如 Eclipse Temurin JRE、Amazon Corretto JRE —— 注意确认是否仍维护)。
Docker 场景建议 • 构建阶段用 eclipse-temurin:17-jdk-jammy
• 运行阶段用 eclipse-temurin:17-jre-jammy(若提供)或更优:eclipse-temurin:17-jdk-jammy + jlink 构建精简镜像(或直接用 jdk-slim 镜像并确保不暴露开发工具)。
安全与合规 政企环境中常要求“运行环境不含编译器”,以防止恶意代码注入后动态编译执行(如反序列化漏洞利用链)。此时 JRE 或 jlink 定制镜像是刚需

✅ 总结:一句话决策指南

场景 推荐
🟢 标准生产部署(Spring Boot JAR / Tomcat WAR) JRE(或 JDK + 严格权限管控 + 不用开发工具)
更佳:jlink 构建最小化运行时镜像(JDK 11+)
🟡 需要线上诊断(如频繁 jstack/jmap JDK(确保运维人员有权限且流程受控)
🔴 服务器上编译 Java 源码(非常规!) JDK(但应反思架构设计——编译应在 CI 完成)
🐳 容器化部署 ✅ 多阶段构建:build stage 用 JDK,runtime stagejrejlink 镜像

如需,我可以为你提供:

  • jlink 构建最小运行时的完整命令示例(适配 Spring Boot);
  • ✅ Dockerfile 多阶段构建模板;
  • ✅ 各主流发行版(Temurin / Corretto / Zulu)的 JRE/JDK 下载指引;
  • ✅ 如何验证服务器上是否意外暴露了 javac 等高危工具。

欢迎继续提问 😊

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