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

在服务器部署 Java 应用时,JRE(Java Runtime Environment)和 JDK(Java Development Kit)的核心区别在于:你只需要 JRE 就能运行程序,而 JDK 包含了 JRE 并额外提供了开发工具。

简单来说:

  • JRE = 运行时环境(只负责“跑”程序)
  • JDK = 开发工具包(包含 JRE + 编译、调试等工具)

一、核心区别对比表

特性 JRE (Java Runtime Environment) JDK (Java Development Kit)
全称 Java 运行时环境 Java 开发工具包
用途 运行已编译的 Java 程序(.class/.jar) 开发、编译、测试、运行 Java 程序
是否包含 JRE ❌ 就是 JRE 本身 ✅ 包含完整的 JRE
主要组件 JVM + 核心类库 + 启动脚本 JRE + javac(编译器)+ jar(打包工具)+ jdb(调试器)+ javadoc(文档生成)等
体积大小 较小(通常几百 MB) 较大(通常 200MB~500MB+)
适用场景 生产环境部署、仅运行应用 本地开发、CI/CD 构建、需要动态编译代码的场景
权限要求 较低(只需执行权限) 较高(需写入编译产物、日志等)

二、详细解释

1. JRE(Java Runtime Environment)

  • 作用:提供 Java 程序运行所需的最小环境。
  • 包含内容:
    • JVM(Java Virtual Machine):真正执行字节码的虚拟机。
    • 核心类库(rt.jar 等):如 java.lang, java.util, java.io 等基础 API。
    • 启动脚本:如 java.exe / java 命令。
  • 优点:
    • 体积小,节省磁盘空间和内存。
    • 安全性更高(没有编译工具,无法轻易修改或重新编译代码)。
    • 适合纯生产环境,降低攻击面。
  • 缺点:
    • 不能用于编译新代码。
    • 如果应用依赖某些动态加载类的功能,可能缺少部分工具支持。

2. JDK(Java Development Kit)

  • 作用:为开发者提供完整的 Java 开发工具链。
  • 包含内容:
    • 完整 JRE(如上所述)。
    • javac:Java 编译器,将 .java 源文件编译成 .class 字节码。
    • jar/jarfile:打包和解压工具。
    • javadoc:从源码注释生成 HTML 文档。
    • jdb:命令行调试器。
    • 其他工具:如 javap(反汇编)、jstat(性能监控)、jmap(内存分析)等。
  • 优点:
    • 功能完整,可用于开发、测试、构建、运行全流程。
    • CI/CD 流水线中常使用 JDK 进行自动化编译和打包。
  • 缺点:
    • 体积大,占用更多资源。
    • 在生产服务器上安装 JDK 可能带来额外的安全风险(黑客可利用编译工具注入恶意代码)。

三、服务器部署建议

✅ 推荐做法:生产环境只装 JRE(或更现代的 JRE/JRE-like 运行时)

  • 如果你的应用是预编译好的(如 .jar, .war, .exe),只需 JRE。
  • 现代最佳实践是使用 OpenJDK Runtime Image (JRI) 或 Docker 镜像中的精简版 JRE,进一步缩小体积。
  • 例如:使用 eclipse-temurin:17-jre-alpine 而不是 eclipse-temurin:17。

⚠️ 何时需要 JDK?

  1. CI/CD 构建阶段:在持续集成服务器(如 Jenkins、GitLab CI)上编译代码。
  2. 热更新/动态编译:某些框架(如 Groovy、Scripting 引擎)需要在运行时动态编译 Java 代码。
  3. 故障排查:运维人员需要现场调试、dump 堆内存、分析线程状态等高级诊断操作(但也可通过远程连接开发机或使用轻量级工具实现)。
  4. 容器化构建:在多阶段 Docker 构建中,第一阶段用 JDK 编译,第二阶段用 JRE 运行,最终镜像只包含 JRE。

四、现代替代方案:GraalVM Native Image 或 精简运行时

随着技术发展,还有更优的选择:

方案 说明
Spring Boot Executable Jar + JRE 最主流方式,JAR 内嵌 Tomcat,只需 JRE 运行。
Docker + JRE 镜像 使用 openjdk:17-jre-slim 等轻量镜像,减少攻击面。
GraalVM Native Image 将 Java 应用提前编译成原生二进制文件,无需 JVM,极致性能和小体积。
jlink(模块化定制 JRE) Java 9+ 支持,可只打包应用所需的模块,生成最小化 JRE,比标准 JRE 更小。

💡 示例:使用 jlink 创建最小 JRE

jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.logging,java.sql --output my-app-runtime

这样生成的 my-app-runtime 只包含你的应用需要的模块,体积远小于完整 JRE。


总结

场景 推荐选择
本地开发 JDK
CI/CD 构建 JDK
生产服务器部署(常规) JRE(或精简 JRE)
生产服务器部署(高性能/小体积) GraalVM Native Image 或 jlink 定制 JRE

结论:对于大多数服务器部署场景,只需安装 JRE 即可。除非你有动态编译或高级调试需求,否则不要在生产服务器上安装完整的 JDK。

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