JDK 17、OpenJDK 17、Oracle JDK 17 的说明
Java生态系统的核心概念:
简单来说:
JDK 17 是一个标准规范,定义了Java开发工具包第17个长期支持版应该包含什么功能。
openjdk-17-jdk 是一个具体的实现,是遵循上述规范、由OpenJDK社区提供的开源软件包。
下面我们通过一个表格和详细解释来深入理解它们的区别。
核心区别对比
特性 | JDK 17 (泛指) | openjdk-17-jdk (特指) |
---|---|---|
本质 | 规范 (Specification) | 实现 (Implementation) |
含义 | Java SE 17平台的标准,定义了应该有哪些功能和API。 | 遵循JDK 17标准的具体、可安装运行的开源代码实现。 |
来源 | 由JCP(Java社区进程)通过JSR(Java规范请求)定义。 | 由OpenJDK社区(由Oracle、Red Hat、IBM、Azul等公司共同维护)构建。 |
许可证 | 无(因为它是规范,不是代码)。 | GPLv2+CPE(开源许可证,可免费商用)。 |
如何获取 | 你不能直接获取“JDK 17”,你获取的是它的某种实现,比如OpenJDK 17、Oracle JDK 17等。 | 通过Linux发行版(如Ubuntu、银河麒麟)的包管理器(如 apt )安装。 |
详细解释与类比
1. JDK 17 - “国家标准”
你可以把 JDK 17 想象成一份 《智能手机国家标准》。
这份标准规定了一部合格的智能手机必须能打电话、发短信、上网、运行符合规范的App等。
只要符合这个标准,不管是华为、小米、苹果还是OPPO生产的手机,都是“智能手机”。
同样,JDK 17 是一个标准,任何实现了这个标准的产品都可以被称为“JDK 17兼容的实现”。
2. openjdk-17-jdk - “华为手机”
而 openjdk-17-jdk 就像是 华为公司根据上述国家标准生产的具体一款手机。
它是标准的一个具体实现。
它是开源的,意味着任何人都可以查看它的源代码,也可以基于它进行修改和分发。
它通常通过Linux系统的软件仓库(如
apt
)来分发和安装,非常方便,与系统集成度高。
3. 其他“手机品牌”
除了 openjdk-17-jdk(华为手机)这个实现,市场上还有其他同样遵循 JDK 17 标准(国家标准)的实现,它们各有特点:
Oracle JDK 17:相当于“苹果手机”。它曾经与OpenJDK在细节上有所不同(比如更好的飞行模式),但现在两者代码库已基本一致。主要区别在于许可证:Oracle JDK 17+ 用于生产环境可能需要付费订阅(除非用于个人开发或测试)。
Azul Zulu Builds of OpenJDK:相当于“华为手机的官方纯净版”。它提供基于OpenJDK源码的预构建二进制包,确保经过测试,并支持多种平台。
Eclipse Temurin:相当于“由开源社区大佬监制的华为手机”。由Eclipse基金会下的Adoptium项目组维护,是又一个高质量、经过全面测试的OpenJDK构建版本。
Amazon Corretto:相当于“亚马逊定制的华为手机(深度优化版)”。由亚马逊提供,自带一些性能优化和长期支持。
在银河麒麟系统上对你意味着什么?
对于你使用的银河麒麟(aarch64架构)系统:
首选安装
openjdk-17-jdk
:
当你运行sudo apt install openjdk-17-jdk
时,你安装的就是由麒麟软件仓库提供的、为你的系统架构预编译好的OpenJDK实现。这是最简单、最安全、与系统集成度最高的方式,因为它会自动处理所有依赖关系。如果需要其他实现:
如果你因为某些原因(例如需要Oracle的特定商业功能、或公司规定)不能使用仓库版的OpenJDK,你才会需要去手动下载并安装 Oracle JDK 17 或 Azul Zulu JDK 17 等其他实现。这时,你安装的仍然是JDK 17的一个实现,只是供应商不同。
总结
你的操作 | 你得到的是什么 | 优点 |
---|---|---|
sudo apt install openjdk-17-jdk | JDK 17规范 的 OpenJDK实现 (由系统仓库提供) | 安装简单、免费、集成度高、更新方便 |
从Oracle官网下载并安装 jdk-17_linux-aarch64_bin.tar.gz | JDK 17规范 的 Oracle JDK实现 | 可能包含最新的紧急修复(但需注意许可证条款) |
从Azul官网下载Zulu的DEB包安装 | JDK 17规范 的 Azul Zulu实现 (基于OpenJDK) | 经过额外测试,提供多平台支持 |
所以,结论是:对于绝大多数用户,在银河麒麟上直接使用 apt install openjdk-17-jdk
就是安装JDK 17的最佳实践。 你得到的是一个完全符合标准、免费且易于管理的JDK。
如何区分安装的是 OpenJDK 17 还是 Oracle JDK 17?
最直接的方法:使用 java -version
命令
打开终端。
输入以下命令并回车:
bash
java -version
观察输出的第一行信息,这是判断的核心依据。
结果判断
根据命令输出,你会看到以下几种典型情况:
情况一:安装的是 OpenJDK
输出中会明确包含 "OpenJDK" 字样。
输出示例:
bash
openjdk version "17.0.11" 2024-04-16 OpenJDK Runtime Environment (build 17.0.11+9-Ubuntu-122.04.1) OpenJDK 64-Bit Server VM (build 17.0.11+9-Ubuntu-122.04.1, mixed mode, sharing)
✅ 关键标识:出现了 OpenJDK
。这清楚地表明你安装的是 OpenJDK 的实现。后面的 Ubuntu
也暗示了这是通过系统包管理器(如 apt
)安装的版本。
情况二:安装的是 Oracle JDK
输出中会包含 "Java(TM) SE Runtime Environment" 字样,并且通常没有 "OpenJDK"。
输出示例:
bash
java version "17.0.10" 2024-01-16 LTS Java(TM) SE Runtime Environment (build 17.0.10+11-LTS-240) Java HotSpot(TM) 64-Bit Server VM (build 17.0.10+11-LTS-240, mixed mode, sharing)
✅ 关键标识:出现了 Java(TM) SE Runtime Environment
和 Java HotSpot(TM)
。(TM)
是商标符号,这是 Oracle 官方发行的 JDK 的典型特征。
其他辅助判断方法
如果 java -version
的输出信息不够明确(有些精简的构建版可能省略了供应商信息),你还可以使用以下命令获取更详细的信息:
1. 使用 apt
政策查询(适用于通过 apt 安装的包)
如果你是通过 sudo apt install openjdk-17-jdk
安装的,那么它几乎100%是 OpenJDK。你可以查询包的详细信息来确认:
bash
apt policy openjdk-17-jdk
这个命令会显示该包的安装版本和来源,如果是来自系统仓库,那它就是 OpenJDK。
2. 查看 JAVA_HOME 路径(适用于手动安装)
检查环境变量 JAVA_HOME
指向的路径,从路径名有时也能看出端倪。
bash
echo $JAVA_HOME
OpenJDK 的典型安装路径可能包含
openjdk-17
或类似结构(尤其是在使用包管理器安装时)。Oracle JDK 如果你手动安装并解压,路径名通常是你自己定义的,可能包含
jdk-17
或jdk17
。
3. 列出已安装的Java相关包
查询通过包管理器安装的Java包,它们的名字会明确指示是OpenJDK。
bash
# 查找已安装的JDK包 dpkg -l | grep openjdk# 或者查找所有包含'jdk'或'java'的包 dpkg -l | grep -E 'jdk|java'
如果你在列表中看到 openjdk-17-jdk
或 openjdk-17-jre
,那就证明是 OpenJDK。
总结与结论
特征检查点 | OpenJDK | Oracle JDK |
---|---|---|
java -version 输出 | 明确包含 OpenJDK 字样 | 包含 Java(TM) SE Runtime Environment 字样 |
安装方式 | 通常通过系统包管理器(如 apt )安装 | 通常从Oracle官网手动下载并安装 |
许可证 | GPLv2+CPE (开源免费) | 需要关注Oracle的许可条款(可能需付费用于商业生产) |
对于你的银河麒麟系统,如果你是通过 sudo apt install openjdk-17-jdk
命令安装的,那么你安装的一定是 OpenJDK 17。
现在,你只需要在终端输入 java -version
,根据输出结果中的关键字,就能立刻确认你正在使用的是哪一种JDK了。