JDK笔记【LST】

1.jdk与openjdk的区别

OpenJDK 和 JDK(通常指 Oracle JDK)是 Java 开发中两个密切相关但有重要区别的实现。以下是它们的核心区别:

一、定义与来源

项目OpenJDKOracle 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 之前较明显,现在已基本消除):

差异点OpenJDKOracle 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 及以后版本基本没有实质区别。

三、支持与更新策略

项目OpenJDKOracle 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 CorrettoAzul 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 是其商业发行版

六、总结

维度OpenJDKOracle JDK
开源✅ 是❌ 否(但 JDK 17+ 免费)
免费✅ 是✅ JDK 17+ 免费(生产可用)
功能✅ 完全一致✅ 完全一致
推荐度⭐⭐⭐⭐⭐⭐⭐⭐⭐
OpenJDK 是 Java 的开源“源代码”,Oracle JDK 是 Oracle 基于 OpenJDK 打包的“发行版”。从 JDK 11 起,两者在功能上几乎无差别,选择哪个主要取决于许可偏好和支持需求。

2.JDK版本切换

在开发或运维环境中,经常需要在 OpenJDKOracle JDK(或其他 JDK 发行版,如 Amazon Corretto、Azul Zulu、Eclipse Temurin 等)之间切换。以下是 在不同操作系统下切换 JDK 的完整方法,包括环境变量管理、工具推荐和最佳实践。


一、通用原则

无论使用哪种操作系统,切换 JDK 的核心是 修改 JAVA_HOMEPATH 环境变量

  • JAVA_HOME:指向 JDK 安装根目录(如 /usr/lib/jvm/openjdk-17
  • PATH:需包含 $JAVA_HOME/bin,确保 javajavac 等命令使用正确版本

二、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 的系统。

步骤:

  1. 安装多个 JDK

    # 示例:安装 OpenJDK 17 和 Oracle JDK 17
    sudo apt install openjdk-17-jdk
    # Oracle JDK 需手动下载并解压到 /opt/oracle-jdk-17
  2. 注册 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
  3. 切换版本

    sudo update-alternatives --config java
    sudo update-alternatives --config javac
  4. 设置 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:手动修改环境变量(图形界面)

  1. 下载并解压 JDK

  2. 设置环境变量

    • 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
    • 编辑 Path,将 %JAVA_HOME%\bin 置顶
  3. 验证

    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

典型输出:

  • OpenJDKopenjdk version "17.0.12" ...
  • Oracle JDKjava version "17.0.12" ... Oracle Corporation

六、最佳实践建议

  1. 开发推荐使用 SDKMAN!(Linux/macOS)或 Jabba(Windows)
  2. 生产环境建议固定使用一个经过验证的 JDK 发行版(如 Temurin、Corretto)
  3. 不要混用不同 JDK 编译和运行(可能导致兼容性问题)
  4. 使用 .java-version 文件(配合 SDKMAN! 或 IDE)指定项目 JDK 版本

总结
切换 OpenJDK 和 Oracle JDK 的本质是 管理 JAVA_HOMEPATH。使用 SDKMAN!(类 Unix)环境变量脚本(Windows) 可以高效、安全地实现多版本共存与快速切换。

3.JDK在不同操作系统中设置环境变量以永久生效的方法

一、Linux / macOS(类 Unix 系统)

✅ 原理

export 命令写入 shell 的启动配置文件中。不同 shell 使用不同文件:

Shell 类型配置文件(用户级)说明
Bash~/.bashrc~/.bash_profileUbuntu/Debian 默认用 .bashrc;macOS 默认用 .bash_profile
Zsh~/.zshrcmacOS Catalina+ 默认 shell
Fish~/.config/fish/config.fish较少见
💡 推荐:优先修改 ~/.bashrc(Bash)或 ~/.zshrc(Zsh)

🔧 步骤(以设置 JAVA_HOME 为例)

  1. 确定 JDK 安装路径

    # 示例路径(根据实际安装调整)
    /usr/lib/jvm/openjdk-17
    /opt/oracle-jdk-17
    /Users/yourname/.sdkman/candidates/java/17.0.12-tem
  2. 编辑配置文件

    # 如果使用 Bash
    nano ~/.bashrc
    
    # 如果使用 Zsh(macOS 默认)
    nano ~/.zshrc
  3. 在文件末尾添加

    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
  4. 保存并重新加载配置

    # Bash
    source ~/.bashrc
    
    # Zsh
    source ~/.zshrc
  5. 验证

    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:图形界面(推荐)

  1. Win + R,输入 sysdm.cpl,回车
  2. 点击 “高级”“环境变量”
  3. “用户变量”(仅当前用户)或 “系统变量”(所有用户)中操作:

    • 新建 JAVA_HOME

      • 变量名:JAVA_HOME
      • 变量值:C:\Program Files\Java\jdk-17.0.12(根据实际路径)
    • 编辑 Path

      • 选中 Path → 点击“编辑”
      • 点击“新建”,添加:%JAVA_HOME%\bin
      • (可选)将该项移到顶部以确保优先使用
  4. 点击“确定”保存所有窗口
  5. 重启命令提示符或 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)才能生效

添加新评论