JDK安装及JRE说明
文章目录
- 一、JDK下载和安装
- 二、配置环境变量
- 三、安装成功验证
- 四、JDK和JRE
- (一)、核心定义与功能定位
- (二)、组成结构对比
- 1. JDK的组成
- 2. JRE的组成
- (三)、关键差异分析
- (四)、典型使用场景
- 1. JDK的使用场景
- 2. JRE的使用场景
- (五)、版本兼容性规则
- (六)、现代开发中的选择建议
- (七)、常见误区澄清
- 五、移除了独立的 JRE 文件夹
- (一)、移除 JRE 的核心原因
- (二)、关键版本节点
- (三)、用户如何适配?
- (四)、常见问题解答
- 六、不设置JAVA_HOME变量可以吗
- (一)、不设置 `JAVA_HOME` 的可行性
- (二)、不设置 `JAVA_HOME` 的潜在问题
- (三)、何时可以省略 `JAVA_HOME`?
- (四)、最佳实践建议
- **总结**
一、JDK下载和安装
- JDK下载地址
- 选择适合 JDK 版本,本文选择JDK 23在Windows x64环境下安装 x64 Installer。
建议:
普通用户:选择 x64 Installer,简便、快速。
开发者或需要灵活控制安装位置的用户:选择 x64 Compressed Archive,需要手动设置环境变量。
IT 管理员或批量部署:选择 x64 MSI Installer,适合批量安装和企业环境。
- 安装 JDK(安装路径D:\JDK)
二、配置环境变量
三、安装成功验证
四、JDK和JRE
JDK(Java Development Kit)和JRE(Java Runtime
Environment)是Java生态系统中两个核心组件,它们在功能定位、组成结构和使用场景上有显著区别。以下是详细对比分析:
(一)、核心定义与功能定位
| 组件 | 全称 | 功能定位 |
|---|---|---|
| JDK | Java Development Kit | 面向开发者的完整工具包,包含编译、调试、运行Java程序所需的所有工具 |
| JRE | Java Runtime Environment | 面向终端用户的运行时环境,仅提供运行已编译Java程序所需的核心组件 |
(二)、组成结构对比
1. JDK的组成
- 核心工具链:
javac:Java编译器(将.java文件编译为.class字节码)java:Java解释器(运行.class文件)javadoc:生成API文档工具jar:打包工具(创建/管理JAR文件)jdb:调试工具
- 开发库:
- Java基础类库(如
java.lang、java.util等) - 开发工具包(如
javax.tools、com.sun.source等)
- Java基础类库(如
- 运行时环境:
- 包含JRE的所有组件(JVM、核心类库等)
2. JRE的组成
- JVM(Java Virtual Machine):
- 执行字节码的核心引擎
- 包含垃圾回收器(GC)、即时编译器(JIT)等
- 核心类库:
java.lang:基础类型、对象模型java.io:输入输出流java.net:网络编程java.util:集合框架、日期时间等
- 其他组件:
- 字符集转换库
- 基础数学库
(三)、关键差异分析
| 维度 | JDK | JRE |
|---|---|---|
| 目标用户 | 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提供调试支持
- Maven/Gradle依赖JDK的
- 学习Java编程:
- 初学者需安装JDK以使用
javac和java命令
- 初学者需安装JDK以使用
2. JRE的使用场景
- 运行Java应用:
- 用户双击JAR文件或通过命令行启动:
java-jarmyapp.jar
- 用户双击JAR文件或通过命令行启动:
- 服务器部署:
- Tomcat等应用服务器仅需JRE即可运行Web应用
- 嵌入式设备:
- 智能卡、IoT设备等资源受限环境仅部署JRE
(五)、版本兼容性规则
向下兼容性:
- 高版本JRE可运行低版本编译的字节码(如JRE 17可运行JDK 8编译的代码)
- 但可能因类库变更导致运行时错误(如使用JDK 17新增的API在JRE 8中不存在)
模块化影响(JDK 9+):
- JDK 9引入的模块系统可能限制反射访问,需通过
--add-opens参数显式开放模块 - 示例:
java--add-opens java.base/java.lang=ALL-UNNAMED-jarmyapp.jar
- JDK 9引入的模块系统可能限制反射访问,需通过
(六)、现代开发中的选择建议
开发者环境:
- 始终安装最新LTS版本的JDK(如JDK 17或JDK 21)
- 使用构建工具(如Maven)管理依赖版本
生产环境:
- 服务器部署JRE(或精简版JDK,如
jlink创建的自定义运行时) - 示例:创建仅包含必要模块的JRE:
jlink --add-modules java.base,java.sql--outputmyjre
- 服务器部署JRE(或精简版JDK,如
容器化部署:
- 使用官方JRE镜像(如
eclipse-temurin:17-jre-jammy) - 示例Dockerfile:
FROM eclipse-temurin:17-jre-jammy COPY target/myapp.jar /app/ CMD ["java", "-jar", "/app/myapp.jar"]
- 使用官方JRE镜像(如
(七)、常见误区澄清
“安装JDK后不需要单独安装JRE”
- 正确:JDK已包含JRE,但某些场景(如仅需运行环境)可单独安装JRE以节省空间
“JRE包含开发工具”
- 错误:JRE仅包含运行时组件,开发工具(如
javac)必须通过JDK获取
- 错误:JRE仅包含运行时组件,开发工具(如
“所有Java程序都需要JDK才能运行”
- 错误:仅需JRE即可运行已编译程序,除非程序动态调用编译API(如通过
javax.tools.ToolProvider)
- 错误:仅需JRE即可运行已编译程序,除非程序动态调用编译API(如通过
通过理解JDK与JRE的差异,开发者可以更精准地配置开发环境,运维人员也能优化生产环境的资源占用。在云原生时代,结合jlink和容器化技术,可以进一步实现Java运行时的轻量化部署。
五、移除了独立的 JRE 文件夹
JDK 从 9 版本开始移除了独立的 JRE 文件夹,并在后续版本(如 JDK 11、JDK 17)中彻底取消了内置 JRE 的设计,仅提供统一的 JDK 下载包。以下是具体原因和背景:
(一)、移除 JRE 的核心原因
模块化系统(JPMS)的引入
JDK 9 引入了Java 模块系统(Project Jigsaw),将 JDK 和 JRE 的组件拆分为可组合的模块(如java.base、java.desktop)。用户可以根据需求按需加载模块,无需安装完整的 JRE,从而减少冗余组件。简化发行版结构
JRE 本质是 JDK 的子集(仅包含运行时所需的核心文件)。Oracle 希望通过统一 JDK 结构,减少安装包体积和目录层级,避免用户混淆开发环境(JDK)和运行环境(JRE)。适应云原生和轻量化部署
随着容器化、微服务的普及,传统庞大的 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中的模块化镜像。
(三)、用户如何适配?
直接使用 JDK 运行程序
JDK 17 的bin/java命令已内置运行时能力,无需额外jre/目录。配置环境变量时,只需指向 JDK 根目录(如JAVA_HOME=/path/to/jdk-17),并在Path中添加%JAVA_HOME%/bin。通过
jlink生成轻量级运行时
若需精简部署(如容器化场景),可使用以下命令生成仅包含必要模块的运行时:jlink --module-path$JAVA_HOME/jmods\--add-modules java.base,java.logging\--outputmy-runtime生成的
my-runtime目录体积可缩小至原 JDK 的 40% 以下。采用第三方 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的可行性
直接运行 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# 直接运行
- 如果通过绝对路径调用
依赖
PATH的工具- 大多数命令行工具(如 Maven、Gradle)会通过
PATH查找java命令,而非直接依赖JAVA_HOME。只要java在PATH中,这些工具通常能正常工作。
- 大多数命令行工具(如 Maven、Gradle)会通过
(二)、不设置JAVA_HOME的潜在问题
开发工具和 IDE 的依赖
- IntelliJ IDEA/Eclipse:需要
JAVA_HOME指定 JDK 路径以编译和运行项目。若未设置,可能报错或无法识别 JDK。 - Visual Studio Code:通过扩展(如
Extension Pack for Java)调用 JDK 时,通常需要JAVA_HOME或手动配置路径。
- IntelliJ IDEA/Eclipse:需要
构建工具的默认行为
- Maven:优先通过
JAVA_HOME查找 JDK。若未设置,可能回退到PATH中的java,但某些插件(如maven-compiler-plugin)可能依赖JAVA_HOME确定编译版本。 - Gradle:类似 Maven,部分任务(如
javaexec)可能依赖JAVA_HOME。
- Maven:优先通过
脚本和第三方工具的兼容性
- 许多脚本(如启动服务、部署工具)会通过
JAVA_HOME定位 JDK。若未设置,可能导致脚本失败或误用系统其他版本的 Java。
- 许多脚本(如启动服务、部署工具)会通过
多 JDK 版本切换困难
- 若系统安装多个 JDK(如 JDK 8 和 JDK 17),不设置
JAVA_HOME时,工具可能默认使用PATH中第一个找到的java,导致版本混乱。通过JAVA_HOME可以显式指定版本。
- 若系统安装多个 JDK(如 JDK 8 和 JDK 17),不设置
(三)、何时可以省略JAVA_HOME?
仅运行简单命令行程序
- 如果仅通过
java -jar MyApp.jar运行程序,且不依赖构建工具或 IDE,可以省略JAVA_HOME(前提是java在PATH中)。
- 如果仅通过
容器化环境
- 在 Docker 或 Kubernetes 中,通常通过绝对路径调用
java(如ENTRYPOINT ["/opt/jdk-17/bin/java", "-jar", "app.jar"]),无需JAVA_HOME。
- 在 Docker 或 Kubernetes 中,通常通过绝对路径调用
使用包装工具
- 工具如
jpackager(JDK 14+)或jlink生成的自定义运行时,已包含所有依赖,无需外部JAVA_HOME。
- 工具如
(四)、最佳实践建议
始终设置
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
- 为避免潜在问题,建议在系统环境变量中配置
验证配置
- 运行以下命令检查是否生效:
echo$JAVA_HOME# Linux/macOSecho%JAVA_HOME%# Windowsjava-version
- 运行以下命令检查是否生效:
多版本管理
- 使用工具如
jenv(macOS/Linux)或SDKMAN!(跨平台)管理多个 JDK 版本,自动切换JAVA_HOME。
- 使用工具如
总结
| 场景 | 是否需要JAVA_HOME |
|---|---|
直接运行java命令 | ❌ 否(需PATH) |
| 使用 Maven/Gradle | ✅ 是(推荐) |
| IDE 开发 | ✅ 是(必需) |
| 容器化部署 | ❌ 否(绝对路径) |
| 脚本调用 | ✅ 是(依赖脚本逻辑) |
结论:虽然不设置JAVA_HOME可以运行部分 Java 程序,但为了兼容性、可维护性和多版本管理,强烈建议始终配置JAVA_HOME。
