努力
奋斗

Java项目部署到生产服务器时,JDK和JRE有什么区别?

服务器

在将 Java 项目部署到生产服务器时,理解 JDK(Java Development Kit)和 JRE(Java Runtime Environment)的区别至关重要。简单来说:

JRE 是运行 Java 程序所必需的最低环境;JDK 包含了 JRE,并额外提供了开发工具。


一、核心区别对比

特性 JRE(Java Runtime Environment) JDK(Java Development Kit)
用途 仅用于运行已编译的 Java 程序(.class/.jar) 用于开发、编译、调试 Java 程序
包含内容 JVM + 核心类库(rt.jar 等) + 基础工具(如 java, javaw) JRE + 编译器(javac)、调试器(jdb)、文档生成器(javadoc)等开发工具
体积 较小(通常几百 MB) 较大(通常 100–200+ MB,取决于版本)
是否必需 ✅ 生产服务器运行 Java 应用必须安装 ❌ 生产服务器不需要安装(除非你在服务器上直接编译代码)
典型组件 bin/java, lib/rt.jar, lib/jce.jar 等 所有 JRE 内容 + bin/javac, bin/jar, bin/javadoc 等

二、生产服务器部署建议

✅ 推荐做法:只安装 JRE(或更现代的 JRE-like 运行时)

  • 如果你的项目已经打包成 .jar、.war(放入 Tomcat/Jetty 等容器)或其他可执行格式,生产服务器只需 JRE。
  • 使用轻量级的 JRE 或 OpenJDK Runtime Only 可以节省磁盘空间、减少攻击面、提升安全性。
  • 现代发行版(如 Ubuntu、CentOS)通常提供 openjdk-<version>-jre 包,而非完整的 jdk 包。
# Ubuntu/Debian 示例
sudo apt install openjdk-17-jre-headless   # 无 GUI 依赖,适合服务器

# CentOS/RHEL 示例
sudo yum install java-17-openjdk-headless

⚠️ 何时需要 JDK?

  • 你在生产服务器上动态编译 Java 代码(极少见,不推荐)。
  • 你需要使用 javac、javadoc、jcmd 等开发/诊断工具进行故障排查(但多数诊断工具在 JRE 中也可用,如 jps、jstat、jmap 等在较新 JRE 中已集成)。
  • 某些监控或 APM 工具可能需要 JDK 中的完整类路径(但大多数现代工具兼容纯 JRE)。

📌 注意:从 Java 9+ 开始,模块化系统引入后,JRE 和 JDK 的界限更加清晰,且许多原本在 JDK 中的工具(如 jcmd、jstack)被移入 JRE 的 bin 目录,因此生产环境即使使用 JRE,也能获得大部分诊断能力。


三、常见误区澄清

误区 正确理解
“生产服务器必须装 JDK” 错误。只要应用能运行,JRE 就足够。
“JDK 比 JRE 更安全” 不一定。JDK 包含更多工具,潜在攻击面更大,生产环境应最小化安装。
“用 JDK 代替 JRE 没问题” 功能上可行,但不符合最小权限原则,浪费资源,增加维护成本。

四、最佳实践总结

  1. 构建阶段:使用 JDK 编译项目,打包为可执行文件(如 Spring Boot fat jar、WAR 等)。
  2. 部署阶段:在生产服务器上仅安装 JRE(推荐 headless 版本,无图形依赖)。
  3. 验证方式:确保 java -version 命令可用即可,无需 javac。
  4. 容器化场景:在 Docker 镜像中,使用基于 jre 或 alpine+jre 的基础镜像,避免嵌入 JDK。
# 推荐的生产级 Dockerfile 片段
FROM eclipse-temurin:17-jre-alpine
COPY app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

五、补充:现代替代方案

  • GraalVM Native Image:将 Java 应用编译为原生二进制文件,完全脱离 JVM,既不需要 JDK 也不需要 JRE。
  • Shaded JAR / Fat JAR:Spring Boot 等项目可将依赖打包进一个 JAR,配合 JRE 即可运行。

✅ 结论:
在生产服务器上,优先选择 JRE(尤其是 headless 版本),除非你有明确的开发或特殊诊断需求才考虑 JDK。这符合“最小化部署”、“安全加固”和“资源优化”的工程原则。

未经允许不得转载:轻量云Cloud » Java项目部署到生产服务器时,JDK和JRE有什么区别?