news 2026/4/15 1:48:21

JDK安装及JRE说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JDK安装及JRE说明

文章目录

  • 一、JDK下载和安装
  • 二、配置环境变量
  • 三、安装成功验证
  • 四、JDK和JRE
      • (一)、核心定义与功能定位
      • (二)、组成结构对比
        • 1. JDK的组成
        • 2. JRE的组成
      • (三)、关键差异分析
      • (四)、典型使用场景
        • 1. JDK的使用场景
        • 2. JRE的使用场景
      • (五)、版本兼容性规则
      • (六)、现代开发中的选择建议
      • (七)、常见误区澄清
  • 五、移除了独立的 JRE 文件夹
      • (一)、移除 JRE 的核心原因
      • (二)、关键版本节点
      • (三)、用户如何适配?
      • (四)、常见问题解答
  • 六、不设置JAVA_HOME变量可以吗
      • (一)、不设置 `JAVA_HOME` 的可行性
      • (二)、不设置 `JAVA_HOME` 的潜在问题
      • (三)、何时可以省略 `JAVA_HOME`?
      • (四)、最佳实践建议
      • **总结**

一、JDK下载和安装

  1. JDK下载地址
  2. 选择适合 JDK 版本,本文选择JDK 23在Windows x64环境下安装 x64 Installer。

建议:
普通用户:选择 x64 Installer,简便、快速。
开发者或需要灵活控制安装位置的用户:选择 x64 Compressed Archive,需要手动设置环境变量。
IT 管理员或批量部署:选择 x64 MSI Installer,适合批量安装和企业环境。

  1. 安装 JDK(安装路径D:\JDK)



二、配置环境变量



三、安装成功验证



四、JDK和JRE

JDK(Java Development Kit)和JRE(Java Runtime
Environment)是Java生态系统中两个核心组件,它们在功能定位、组成结构和使用场景上有显著区别。以下是详细对比分析:

(一)、核心定义与功能定位

组件全称功能定位
JDKJava Development Kit面向开发者的完整工具包,包含编译、调试、运行Java程序所需的所有工具
JREJava Runtime Environment面向终端用户的运行时环境,仅提供运行已编译Java程序所需的核心组件

(二)、组成结构对比

1. JDK的组成
  • 核心工具链
    • javac:Java编译器(将.java文件编译为.class字节码)
    • java:Java解释器(运行.class文件)
    • javadoc:生成API文档工具
    • jar:打包工具(创建/管理JAR文件)
    • jdb:调试工具
  • 开发库
    • Java基础类库(如java.langjava.util等)
    • 开发工具包(如javax.toolscom.sun.source等)
  • 运行时环境
    • 包含JRE的所有组件(JVM、核心类库等)
2. JRE的组成
  • JVM(Java Virtual Machine)
    • 执行字节码的核心引擎
    • 包含垃圾回收器(GC)、即时编译器(JIT)等
  • 核心类库
    • java.lang:基础类型、对象模型
    • java.io:输入输出流
    • java.net:网络编程
    • java.util:集合框架、日期时间等
  • 其他组件
    • 字符集转换库
    • 基础数学库

(三)、关键差异分析

维度JDKJRE
目标用户Java开发者Java程序运行者(如终端用户)
包含内容开发工具 + JRE仅JVM + 核心类库
磁盘占用较大(约400MB+)较小(约150MB)
功能范围编译、调试、运行、文档生成仅运行已编译程序
更新频率与Java版本同步更新(每6个月)通常随JDK更新,但用户可单独升级

(四)、典型使用场景

1. JDK的使用场景
  • 开发Java应用
    # 编译Java程序javac HelloWorld.java# 运行Java程序javaHelloWorld
  • 构建工具集成
    • Maven/Gradle依赖JDK的javac进行编译
    • IDE(如IntelliJ IDEA、Eclipse)需要JDK提供调试支持
  • 学习Java编程
    • 初学者需安装JDK以使用javacjava命令
2. JRE的使用场景
  • 运行Java应用
    • 用户双击JAR文件或通过命令行启动:
      java-jarmyapp.jar
  • 服务器部署
    • Tomcat等应用服务器仅需JRE即可运行Web应用
  • 嵌入式设备
    • 智能卡、IoT设备等资源受限环境仅部署JRE

(五)、版本兼容性规则

  1. 向下兼容性

    • 高版本JRE可运行低版本编译的字节码(如JRE 17可运行JDK 8编译的代码)
    • 但可能因类库变更导致运行时错误(如使用JDK 17新增的API在JRE 8中不存在)
  2. 模块化影响(JDK 9+)

    • JDK 9引入的模块系统可能限制反射访问,需通过--add-opens参数显式开放模块
    • 示例:
      java--add-opens java.base/java.lang=ALL-UNNAMED-jarmyapp.jar

(六)、现代开发中的选择建议

  1. 开发者环境

    • 始终安装最新LTS版本的JDK(如JDK 17或JDK 21)
    • 使用构建工具(如Maven)管理依赖版本
  2. 生产环境

    • 服务器部署JRE(或精简版JDK,如jlink创建的自定义运行时)
    • 示例:创建仅包含必要模块的JRE:
      jlink --add-modules java.base,java.sql--outputmyjre
  3. 容器化部署

    • 使用官方JRE镜像(如eclipse-temurin:17-jre-jammy
    • 示例Dockerfile:
      FROM eclipse-temurin:17-jre-jammy COPY target/myapp.jar /app/ CMD ["java", "-jar", "/app/myapp.jar"]

(七)、常见误区澄清

  1. “安装JDK后不需要单独安装JRE”

    • 正确:JDK已包含JRE,但某些场景(如仅需运行环境)可单独安装JRE以节省空间
  2. “JRE包含开发工具”

    • 错误:JRE仅包含运行时组件,开发工具(如javac)必须通过JDK获取
  3. “所有Java程序都需要JDK才能运行”

    • 错误:仅需JRE即可运行已编译程序,除非程序动态调用编译API(如通过javax.tools.ToolProvider

通过理解JDK与JRE的差异,开发者可以更精准地配置开发环境,运维人员也能优化生产环境的资源占用。在云原生时代,结合jlink和容器化技术,可以进一步实现Java运行时的轻量化部署。


五、移除了独立的 JRE 文件夹

JDK 从 9 版本开始移除了独立的 JRE 文件夹,并在后续版本(如 JDK 11、JDK 17)中彻底取消了内置 JRE 的设计,仅提供统一的 JDK 下载包。以下是具体原因和背景:

(一)、移除 JRE 的核心原因

  1. 模块化系统(JPMS)的引入
    JDK 9 引入了Java 模块系统(Project Jigsaw),将 JDK 和 JRE 的组件拆分为可组合的模块(如java.basejava.desktop)。用户可以根据需求按需加载模块,无需安装完整的 JRE,从而减少冗余组件。

  2. 简化发行版结构
    JRE 本质是 JDK 的子集(仅包含运行时所需的核心文件)。Oracle 希望通过统一 JDK 结构,减少安装包体积和目录层级,避免用户混淆开发环境(JDK)和运行环境(JRE)。

  3. 适应云原生和轻量化部署
    随着容器化、微服务的普及,传统庞大的 JRE(约 150-200MB)已无法满足需求。通过jlink工具,用户可以生成仅包含必要模块的轻量级运行时镜像(最小可压缩至 15-25MB),显著提升启动速度和资源利用率。

(二)、关键版本节点

  • JDK 9(2017 年发布)
    首次引入模块化系统,允许用户通过jlink生成自定义运行时,但未完全移除 JRE 文件夹(仍可通过特定方式生成)。

  • JDK 10/11(2018 年发布)
    逐步收敛目录结构,主流 OpenJDK 发行版(如 AdoptOpenJDK)开始默认不包含 JRE 文件夹。

  • JDK 17(2021 年发布,LTS 版本)
    Oracle 及主流发行版(如 Eclipse Temurin、Amazon Corretto)彻底移除jre/子目录,JDK 本身即成为“全功能运行时”,bin/java命令直接依赖lib/modules中的模块化镜像。

(三)、用户如何适配?

  1. 直接使用 JDK 运行程序
    JDK 17 的bin/java命令已内置运行时能力,无需额外jre/目录。配置环境变量时,只需指向 JDK 根目录(如JAVA_HOME=/path/to/jdk-17),并在Path中添加%JAVA_HOME%/bin

  2. 通过jlink生成轻量级运行时
    若需精简部署(如容器化场景),可使用以下命令生成仅包含必要模块的运行时:

    jlink --module-path$JAVA_HOME/jmods\--add-modules java.base,java.logging\--outputmy-runtime

    生成的my-runtime目录体积可缩小至原 JDK 的 40% 以下。

  3. 采用第三方 JRE 替代方案
    部分社区提供兼容 Java SE 标准的运行时实现(如 Eclipse Temurin、Azul Zulu),但这些发行版也遵循模块化设计,不再单独分发 JRE。

(四)、常见问题解答

  • Q:为什么 JDK 17 安装后没有jre文件夹?
    A:自 JDK 9 起,Oracle 逐步移除独立 JRE,JDK 17 彻底取消了该结构。JDK 本身已包含所有运行时组件,bin/java可直接启动程序。

  • Q:旧脚本或 IDE 报错JAVA_HOME/jre/bin/java找不到怎么办?
    A:将脚本或 IDE 配置中的路径更新为JAVA_HOME/bin/java,并确保JAVA_HOME指向 JDK 根目录。

  • Q:是否需要重新下载 JRE?
    A:无需单独下载 JRE,JDK 17 已满足开发和运行需求。若需轻量级运行时,使用jlink生成即可。


六、不设置JAVA_HOME变量可以吗

不设置JAVA_HOME环境变量是可以运行 Java 程序的,但可能会影响某些工具、开发环境或脚本的正常工作。以下是详细分析:

(一)、不设置JAVA_HOME的可行性

  1. 直接运行 Java 程序

    • 如果通过绝对路径调用java命令(如/path/to/jdk-17/bin/java MyApp),或已将 JDK 的bin目录添加到系统的PATH环境变量中,则可以直接运行java -version或启动程序,无需依赖JAVA_HOME
    • 示例
      # 假设 JDK 安装在 /opt/jdk-17exportPATH=/opt/jdk-17/bin:$PATH# 临时添加到 PATHjava-version# 直接运行
  2. 依赖PATH的工具

    • 大多数命令行工具(如 Maven、Gradle)会通过PATH查找java命令,而非直接依赖JAVA_HOME。只要javaPATH中,这些工具通常能正常工作。

(二)、不设置JAVA_HOME的潜在问题

  1. 开发工具和 IDE 的依赖

    • IntelliJ IDEA/Eclipse:需要JAVA_HOME指定 JDK 路径以编译和运行项目。若未设置,可能报错或无法识别 JDK。
    • Visual Studio Code:通过扩展(如Extension Pack for Java)调用 JDK 时,通常需要JAVA_HOME或手动配置路径。
  2. 构建工具的默认行为

    • Maven:优先通过JAVA_HOME查找 JDK。若未设置,可能回退到PATH中的java,但某些插件(如maven-compiler-plugin)可能依赖JAVA_HOME确定编译版本。
    • Gradle:类似 Maven,部分任务(如javaexec)可能依赖JAVA_HOME
  3. 脚本和第三方工具的兼容性

    • 许多脚本(如启动服务、部署工具)会通过JAVA_HOME定位 JDK。若未设置,可能导致脚本失败或误用系统其他版本的 Java。
  4. 多 JDK 版本切换困难

    • 若系统安装多个 JDK(如 JDK 8 和 JDK 17),不设置JAVA_HOME时,工具可能默认使用PATH中第一个找到的java,导致版本混乱。通过JAVA_HOME可以显式指定版本。

(三)、何时可以省略JAVA_HOME

  1. 仅运行简单命令行程序

    • 如果仅通过java -jar MyApp.jar运行程序,且不依赖构建工具或 IDE,可以省略JAVA_HOME(前提是javaPATH中)。
  2. 容器化环境

    • 在 Docker 或 Kubernetes 中,通常通过绝对路径调用java(如ENTRYPOINT ["/opt/jdk-17/bin/java", "-jar", "app.jar"]),无需JAVA_HOME
  3. 使用包装工具

    • 工具如jpackager(JDK 14+)或jlink生成的自定义运行时,已包含所有依赖,无需外部JAVA_HOME

(四)、最佳实践建议

  1. 始终设置JAVA_HOME

    • 为避免潜在问题,建议在系统环境变量中配置JAVA_HOME,并指向当前使用的 JDK 目录(如C:\Program Files\Java\jdk-17/usr/lib/jvm/jdk-17)。
    • Windows
      setx JAVA_HOME "C:\Program Files\Java\jdk-17" setx PATH "%JAVA_HOME%\bin;%PATH%"
    • Linux/macOS
      ~/.bashrc~/.zshrc中添加:
      exportJAVA_HOME=/opt/jdk-17exportPATH=$JAVA_HOME/bin:$PATH
  2. 验证配置

    • 运行以下命令检查是否生效:
      echo$JAVA_HOME# Linux/macOSecho%JAVA_HOME%# Windowsjava-version
  3. 多版本管理

    • 使用工具如jenv(macOS/Linux)或SDKMAN!(跨平台)管理多个 JDK 版本,自动切换JAVA_HOME

总结

场景是否需要JAVA_HOME
直接运行java命令❌ 否(需PATH
使用 Maven/Gradle✅ 是(推荐)
IDE 开发✅ 是(必需)
容器化部署❌ 否(绝对路径)
脚本调用✅ 是(依赖脚本逻辑)

结论:虽然不设置JAVA_HOME可以运行部分 Java 程序,但为了兼容性、可维护性和多版本管理,强烈建议始终配置JAVA_HOME

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 1:48:18

别再手动算脉冲了!用STM32CubeMX的编码器模式,5分钟搞定直流电机测速(附防溢出处理代码)

STM32CubeMX编码器模式实战:直流电机测速与防溢出设计全解析 引言:为什么我们需要更智能的编码器处理方案? 在机器人底盘控制、智能小车和工业自动化设备中,直流电机转速的精确测量是运动控制的基础。传统的手动脉冲计数方法不仅效…

作者头像 李华
网站建设 2026/4/15 1:43:27

自动化AI渗透测试 及蓝队安全体系建设系统

自己写了一个AI渗透测试智能体平台,可以拿了学习测试 # Argus AI 渗透测试智能体平台 版权所有 (C) 2026 ByteGuard. 保留所有权利。 > **重要声明**: 本软件为 ByteGuard 专有软件。未经 ByteGuard 书面许可,禁止以任何形式复制、修改、分发或使用本软件。 > >…

作者头像 李华
网站建设 2026/4/15 1:41:22

排序算法全解析:从入门到精通,计算机网络第四章(5)——网络层《路由协议+路由协议》。

排序算法概述 排序算法是计算机科学中用于将一组数据按照特定顺序排列的算法。常见的排序顺序包括升序和降序。排序算法在数据处理、数据库操作、信息检索等领域有广泛应用。 常见排序算法分类 排序算法可以分为比较排序和非比较排序两大类。比较排序通过比较元素间的大小关系进…

作者头像 李华
网站建设 2026/4/15 1:40:22

如何5分钟快速上手抖音批量下载神器:douyin-downloader完整指南

如何5分钟快速上手抖音批量下载神器:douyin-downloader完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…

作者头像 李华
网站建设 2026/4/15 1:40:21

3个理由告诉你为什么League Akari是英雄联盟玩家的必备智能助手

3个理由告诉你为什么League Akari是英雄联盟玩家的必备智能助手 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾经在英雄联盟游戏中&a…

作者头像 李华