1.jdk与openjdk的区别
OpenJDK 和 JDK(通常指 Oracle JDK)是 Java 开发中两个密切相关但有重要区别的实现。以下是它们的核心区别:
一、定义与来源
项目 | OpenJDK | Oracle JDK |
---|---|---|
性质 | 开源参考实现(Reference Implementation) | 商业发行版(由 Oracle 提供) |
许可证 | GPLv2 + Classpath Exception(完全免费、开源) | 自 2019 年起: • JDK 17+:免费用于生产环境(Oracle Free Terms and Conditions, NFTC) • JDK 8–16:商业使用需付费(除非使用旧版本) |
开发主体 | 社区主导(Oracle、Red Hat、Amazon、Microsoft 等共同贡献) | Oracle 公司主导开发和发布 |
二、功能与代码差异(以 JDK 17+ 为例)
✅ 从 JDK 11 开始,Oracle JDK 与 OpenJDK 几乎完全一致
- Oracle 宣布:自 JDK 11 起,Oracle JDK 的构建基于 OpenJDK 源码
- 功能、性能、API 几乎无差别
- 两者共享相同的 JEP(JDK Enhancement Proposals)
⚠️ 微小差异(主要在 JDK 17 之前较明显,现在已基本消除):
差异点 | OpenJDK | Oracle JDK |
---|---|---|
图标 | 使用 Duke 图标 | 使用 Java Cup / Steam 图标 |
字体渲染 | 使用 FreeType(GPLv2 许可) | 使用 FreeType(FreeType License) |
源码注释 | 标注 GPL 许可 | 标注 “ORACLE PROPRIETARY/CONFIDENTIAL”(尽管功能相同) |
安装包格式 | 通常为 .tar.gz 或系统包(如 .deb , .rpm ) | 提供 .exe , .dmg , .msi 等图形化安装包 |
📌 关键结论:从功能和性能角度看,OpenJDK 与 Oracle JDK 在 JDK 11 及以后版本基本没有实质区别。
三、支持与更新策略
项目 | OpenJDK | Oracle JDK |
---|---|---|
更新频率 | 每 6 个月一个新版本(非 LTS),由社区维护 | 同步 OpenJDK 发布节奏 |
LTS 支持 | 社区或第三方厂商提供(如 Red Hat、Azul、Adoptium) | Oracle 提供 免费 LTS 更新至 2029 年(JDK 17) • 包含安全补丁和 bug 修复 • 无需付费 |
商业支持 | 需通过第三方(如 Azul、Red Hat、IBM)购买 | Oracle 提供付费高级支持(如 24/7 技术服务) |
四、如何选择?
✅ 推荐使用 OpenJDK 如果:
- 你希望使用完全开源、免费的 JDK
- 你使用云厂商或 Linux 发行版(如 Ubuntu、CentOS)自带的 JDK
- 你通过 Eclipse Adoptium (Temurin)、Amazon Corretto、Azul Zulu 等获得企业级支持
✅ 推荐使用 Oracle JDK 如果:
- 你信任 Oracle 的官方构建和测试流程
- 你需要官方图形化安装包(Windows/macOS)
- 你希望直接从 Oracle 获取 LTS 版本的免费安全更新(JDK 17+)
💡 实际建议:对于大多数开发者和企业,OpenJDK(如 Eclipse Temurin 或 Amazon Corretto)是更主流、更灵活的选择。
五、常见误区澄清
误区 | 正确理解 |
---|---|
“Oracle JDK 性能更好” | ❌ 两者基于相同代码,性能无差异 |
“OpenJDK 不适合生产环境” | ❌ 大量企业(包括 Netflix、Twitter)使用 OpenJDK |
“Oracle JDK 是‘官方’JDK,OpenJDK 是‘社区版’” | ⚠️ OpenJDK 才是 Java SE 的官方参考实现,Oracle JDK 是其商业发行版 |
六、总结
维度 | OpenJDK | Oracle JDK |
---|---|---|
开源 | ✅ 是 | ❌ 否(但 JDK 17+ 免费) |
免费 | ✅ 是 | ✅ JDK 17+ 免费(生产可用) |
功能 | ✅ 完全一致 | ✅ 完全一致 |
推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
OpenJDK 是 Java 的开源“源代码”,Oracle JDK 是 Oracle 基于 OpenJDK 打包的“发行版”。从 JDK 11 起,两者在功能上几乎无差别,选择哪个主要取决于许可偏好和支持需求。
2.JDK版本切换
在开发或运维环境中,经常需要在 OpenJDK 和 Oracle JDK(或其他 JDK 发行版,如 Amazon Corretto、Azul Zulu、Eclipse Temurin 等)之间切换。以下是 在不同操作系统下切换 JDK 的完整方法,包括环境变量管理、工具推荐和最佳实践。
一、通用原则
无论使用哪种操作系统,切换 JDK 的核心是 修改 JAVA_HOME
和 PATH
环境变量:
JAVA_HOME
:指向 JDK 安装根目录(如/usr/lib/jvm/openjdk-17
)PATH
:需包含$JAVA_HOME/bin
,确保java
、javac
等命令使用正确版本
二、Linux / macOS 切换方法
方法 1:手动修改环境变量(临时)
# 查看当前 Java 版本
java -version
# 临时切换到 OpenJDK(假设已安装在 /usr/lib/jvm/openjdk-17)
export JAVA_HOME=/usr/lib/jvm/openjdk-17
export PATH=$JAVA_HOME/bin:$PATH
# 验证
java -version
echo $JAVA_HOME
✅ 优点:快速、无需安装工具
❌ 缺点:仅当前终端会话有效,关闭后失效
方法 2:使用 update-alternatives
(Linux 推荐)
适用于 Ubuntu、Debian、CentOS 等支持 alternatives
的系统。
步骤:
安装多个 JDK
# 示例:安装 OpenJDK 17 和 Oracle JDK 17 sudo apt install openjdk-17-jdk # Oracle JDK 需手动下载并解压到 /opt/oracle-jdk-17
注册 JDK 到 alternatives
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 100 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac 100 sudo update-alternatives --install /usr/bin/java java /opt/oracle-jdk-17/bin/java 200 sudo update-alternatives --install /usr/bin/javac javac /opt/oracle-jdk-17/bin/javac 200
切换版本
sudo update-alternatives --config java sudo update-alternatives --config javac
设置
JAVA_HOME
(可选)
在~/.bashrc
或~/.zshrc
中添加:export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
✅ 优点:系统级管理,持久有效
✅ 支持多版本共存,一键切换
方法 3:使用 SDKMAN!(开发者推荐)
SDKMAN! 是专为 JVM 语言(Java、Kotlin、Groovy 等)设计的版本管理工具。
安装 SDKMAN!
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman.sh"
安装和切换 JDK
# 查看可用 JDK 发行版
sdk list java
# 安装 OpenJDK 17(来自 Eclipse Temurin)
sdk install java 17.0.12-tem
# 安装 Oracle JDK 17
sdk install java 17.0.12-oracle
# 切换为默认 JDK
sdk default java 17.0.12-tem
# 临时切换(仅当前 shell)
sdk use java 17.0.12-oracle
# 查看当前版本
java -version
✅ 优点:
- 自动下载、安装、配置
JAVA_HOME
- 支持数十种 JDK 发行版(Temurin、Zulu、Corretto、Oracle、GraalVM 等)
- 开发者友好,命令简洁
三、Windows 切换方法
方法 1:手动修改环境变量(图形界面)
下载并解压 JDK
- OpenJDK:如 Eclipse Temurin
- Oracle JDK:Oracle 官网
设置环境变量
- 按
Win + R
→ 输入sysdm.cpl
→ “高级” → “环境变量” 新建或修改
JAVA_HOME
:- OpenJDK:
C:\Program Files\Eclipse Adoptium\jdk-17.0.12-hotspot
- Oracle JDK:
C:\Program Files\Java\jdk-17.0.12
- OpenJDK:
- 编辑
Path
,将%JAVA_HOME%\bin
置顶
- 按
验证
java -version echo %JAVA_HOME%
方法 2:使用命令行脚本(快速切换)
创建两个批处理文件:
switch-to-openjdk.bat
@echo off
setx JAVA_HOME "C:\Program Files\Eclipse Adoptium\jdk-17.0.12-hotspot"
setx PATH "%JAVA_HOME%\bin;%PATH%"
echo Switched to OpenJDK
switch-to-oraclejdk.bat
@echo off
setx JAVA_HOME "C:\Program Files\Java\jdk-17.0.12"
setx PATH "%JAVA_HOME%\bin;%PATH%"
echo Switched to Oracle JDK
⚠️ 注意:setx
修改的是用户环境变量,需重启终端生效。
方法 3:使用工具(推荐)
- Jabba(跨平台,类似 SDKMAN!)
Chocolatey(Windows 包管理器):
choco install temurin17 choco install oraclejdk17
四、IDE 中的 JDK 切换
即使系统 JDK 切换了,IDE 可能仍使用内置或项目指定的 JDK:
IntelliJ IDEA
- 项目 JDK:File → Project Structure → Project Settings → Project → SDK
- 模块 JDK:Project Structure → Modules → Dependencies → Module SDK
Eclipse
- Window → Preferences → Java → Installed JREs → Add...
VS Code
在
settings.json
中配置:"java.home": "/path/to/your/jdk"
五、验证切换是否成功
# 检查 Java 版本和供应商
java -version
# 检查 JAVA_HOME
echo $JAVA_HOME # Linux/macOS
echo %JAVA_HOME% # Windows
# 检查 javac 路径
which java # Linux/macOS
where java # Windows
典型输出:
- OpenJDK:
openjdk version "17.0.12" ...
- Oracle JDK:
java version "17.0.12" ... Oracle Corporation
六、最佳实践建议
- 开发推荐使用 SDKMAN!(Linux/macOS)或 Jabba(Windows)
- 生产环境建议固定使用一个经过验证的 JDK 发行版(如 Temurin、Corretto)
- 不要混用不同 JDK 编译和运行(可能导致兼容性问题)
- 使用
.java-version
文件(配合 SDKMAN! 或 IDE)指定项目 JDK 版本
✅ 总结:
切换 OpenJDK 和 Oracle JDK 的本质是 管理 JAVA_HOME
和 PATH
。使用 SDKMAN!(类 Unix) 或 环境变量脚本(Windows) 可以高效、安全地实现多版本共存与快速切换。
3.JDK在不同操作系统中设置环境变量以永久生效的方法
一、Linux / macOS(类 Unix 系统)
✅ 原理
将 export
命令写入 shell 的启动配置文件中。不同 shell 使用不同文件:
Shell 类型 | 配置文件(用户级) | 说明 |
---|---|---|
Bash | ~/.bashrc 或 ~/.bash_profile | Ubuntu/Debian 默认用 .bashrc ;macOS 默认用 .bash_profile |
Zsh | ~/.zshrc | macOS Catalina+ 默认 shell |
Fish | ~/.config/fish/config.fish | 较少见 |
💡 推荐:优先修改~/.bashrc
(Bash)或~/.zshrc
(Zsh)
🔧 步骤(以设置 JAVA_HOME
为例)
确定 JDK 安装路径
# 示例路径(根据实际安装调整) /usr/lib/jvm/openjdk-17 /opt/oracle-jdk-17 /Users/yourname/.sdkman/candidates/java/17.0.12-tem
编辑配置文件
# 如果使用 Bash nano ~/.bashrc # 如果使用 Zsh(macOS 默认) nano ~/.zshrc
在文件末尾添加
export JAVA_HOME=/your/actual/jdk/path export PATH=$JAVA_HOME/bin:$PATH
示例:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
保存并重新加载配置
# Bash source ~/.bashrc # Zsh source ~/.zshrc
验证
echo $JAVA_HOME java -version
✅ 此设置对当前用户永久生效,重启终端后依然有效。
⚠️ 系统级全局设置(所有用户)
如需对所有用户生效,可修改:
/etc/environment
(适用于所有 shell,格式为KEY=value
,不支持变量引用)/etc/profile
或/etc/profile.d/myenv.sh
(支持export
)
示例(/etc/profile.d/java.sh
):
sudo nano /etc/profile.d/java.sh
内容:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
然后:
sudo chmod +x /etc/profile.d/java.sh
二、Windows
方法 1:图形界面(推荐)
- 按
Win + R
,输入sysdm.cpl
,回车 - 点击 “高级” → “环境变量”
在 “用户变量”(仅当前用户)或 “系统变量”(所有用户)中操作:
新建
JAVA_HOME
:- 变量名:
JAVA_HOME
- 变量值:
C:\Program Files\Java\jdk-17.0.12
(根据实际路径)
- 变量名:
编辑
Path
:- 选中
Path
→ 点击“编辑” - 点击“新建”,添加:
%JAVA_HOME%\bin
- (可选)将该项移到顶部以确保优先使用
- 选中
- 点击“确定”保存所有窗口
重启命令提示符或 PowerShell,验证:
echo %JAVA_HOME% java -version
✅ 此设置永久生效,重启系统后依然有效。
方法 2:PowerShell 命令(管理员权限)
# 设置用户级环境变量(无需管理员)
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-17.0.12", "User")
[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";%JAVA_HOME%\bin", "User")
# 设置系统级(需管理员权限)
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-17.0.12", "Machine")
⚠️ 修改后需重启终端或执行 refreshenv
(需安装 Chocolatey)才能生效。
三、验证是否永久生效
Linux / macOS
# 关闭终端,重新打开
echo $JAVA_HOME
java -version
Windows
:: 关闭命令行,重新打开
echo %JAVA_HOME%
java -version
四、常见问题排查
问题 | 解决方案 |
---|---|
修改后 java -version 仍显示旧版本 | 检查 PATH 中是否有其他 JDK 路径在前;重启终端 |
JAVA_HOME 显示为空 | 确认写入的是正确的 shell 配置文件(.zshrc vs .bashrc ) |
Windows 中 %JAVA_HOME% 无效 | 确保 Path 中使用的是 %JAVA_HOME%\bin ,且变量名拼写正确 |
权限不足(Linux) | 不要使用 sudo 修改用户配置文件;系统级修改需 sudo |
✅ 总结
系统 | 推荐方法 | 配置文件/位置 |
---|---|---|
Linux / macOS | 编辑 shell 配置文件 | ~/.bashrc 或 ~/.zshrc |
Windows | 图形界面设置 | 系统属性 → 环境变量 |
关键点:
- 用户级设置:只影响当前用户,安全且常用
- 系统级设置:影响所有用户,需谨慎
- 修改后必须重启终端(或执行
source
)才能生效