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架构)系统:

  1. 首选安装 openjdk-17-jdk
    当你运行 sudo apt install openjdk-17-jdk 时,你安装的就是由麒麟软件仓库提供的、为你的系统架构预编译好的OpenJDK实现。这是最简单、最安全、与系统集成度最高的方式,因为它会自动处理所有依赖关系。

  2. 如果需要其他实现
    如果你因为某些原因(例如需要Oracle的特定商业功能、或公司规定)不能使用仓库版的OpenJDK,你才会需要去手动下载并安装 Oracle JDK 17 或 Azul Zulu JDK 17 等其他实现。这时,你安装的仍然是JDK 17的一个实现,只是供应商不同。

总结

你的操作你得到的是什么优点
sudo apt install openjdk-17-jdkJDK 17规范 的 OpenJDK实现 (由系统仓库提供)安装简单、免费、集成度高、更新方便
从Oracle官网下载并安装 jdk-17_linux-aarch64_bin.tar.gzJDK 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 命令

  1. 打开终端。

  2. 输入以下命令并回车:

    bash

    java -version
  3. 观察输出的第一行信息,这是判断的核心依据。


结果判断

根据命令输出,你会看到以下几种典型情况:

情况一:安装的是 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。

总结与结论

特征检查点OpenJDKOracle 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了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96463.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96463.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96463.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写MyBatis第58弹:如何优雅输出可执行的SQL语句--深入理解MyBatis日志机制:

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

Spring Boot 监控实战:集成 Prometheus 与 Grafana,打造全方位监控体系

前言 在当今微服务架构盛行的时代,应用程序的监控变得尤为重要。Spring Boot 作为广泛使用的微服务框架,其监控需求也日益增加。Prometheus 和 Grafana 作为开源监控领域的佼佼者,为 Spring Boot 应用提供了强大的监控能力。本文将详细介绍如…

JS中的多线程——Web Worker

众所周知,JavaScript 是单线程运行的(至于为什么是单线程可以看一下这篇文章——事件循环机制),当浏览器主线程被大量计算任务阻塞时,页面就会出现明显的卡顿现象。Web Worker 提供了在独立线程中运行 JavaScript 的能…

【SQL注入】延时盲注

sleep(n)​​: 核心延时函数。使数据库程序暂停 n秒。​​if(condition, true_expr, false_expr)​​: 条件判断函数。如果 condition为真,执行 true_expr,否则执行 false_expr。​​用于将延时与判断条件绑定​​。​​mid(a, b, c)​​: 字符串截取函数…

IntelliJ IDEA 2025.1 Java Stream Debugger 快速使用指南

1. 功能概览 Java Stream Debugger 提供 Trace Current Stream Chain 功能,用来在调试时分析和可视化 Stream 操作链。 主要用途: 在运行时查看流操作链的每一步输出找出 map/filter 等操作的问题避免手动加 peek() 打印调试2. 使用入口 在 IDEA 2025.1 …

ARM-指令集全解析:从基础到高阶应用

一、ARM 指令集体系结构版本ARM 公司定义了多个指令集版本:ARMv1:原型机 ARM1,没有用于商业产品。ARMv2:扩展 V1,包含 32 位乘法指令和协处理器指令。ARMv3:第一个微处理器 ARM6 核心,支持 Cach…

第3讲 机器学习入门指南

近年来,随着企业和个人生成的数据量呈指数级增长,机器学习已成为日益重要的技术领域。从自动驾驶汽车到流媒体平台的个性化推荐,机器学习算法已广泛应用于各个场景。让我们深入解析机器学习的核心要义。3.1 机器学习定义机器学习是人工智能的…

深入理解跳表:多层索引加速查找的经典实现

跳表(Skip List)是一种多层有序链表结构,通过引入多级索引加速查找,其核心设计类似于“立体高速公路系统”,底层是原始链表,上面有各种高度的"高架桥"。 高层道路跨度大,连接远方节点…

Flutter 视频播放器——flick_video_player 介绍与使用

在移动端应用中,视频播放是一个常见的功能场景,例如短视频、直播、课程、广告展示等。 Flutter 本身并没有直接提供视频播放器组件,而是依赖第三方库来实现。 今天要介绍的库是 flick_video_player,它基于 video_player 封装&…

编写cmakelists文件常用语句

cmake_minimum_required (VERSION 3.10) 指定最小版本project(XXXX) 指定项目名字 ---------------set(MAIN_EXEC_NAME dwarf_parser) 定义变量${ MAIN_EXEC_NAME } 变量取值set(CMAKE_CXX_STANDARD 14) 指定c14标准,还有11、17、20等标准…

麒麟桌面系统找不到mbr启动,并重新安装grub

根据你提供的情况,“麒麟桌面系统找不到MBR启动”,这通常是由于GRUB引导损坏、MBR记录丢失或分区表异常导致的。你可以按照以下步骤重新安装GRUB并修复MBR启动: ✅ 步骤一:准备工具 使用银河麒麟LiveCD或U盘启动盘(可用Ventoy制作); 启动电脑,选择从U盘或光盘进入Live环…

【音频字幕】构建一个离线视频字幕生成系统:使用 WhisperX 和 Faster-Whisper 的 Python 实现

一、背景介绍 对于一端没有字幕外国视频、字幕,在不懂外语的情况下,怎么获取相关内容?作为技术宅,怎么自建搭建一个语音转文字的环境当前AI技术这么发达? 试试 二、系统设计 音频提取(仅仅是视频需要该逻辑、本身就是音…

Linux ALSA架构:PCM_OPEN流程 (二)

一 应用端源码路径: external\tinyalsa\pcm.c external\tinyalsa\pcm_hw.cstruct pcm *pcm_open(unsigned int card, unsigned int device,unsigned int flags, struct pcm_config *config) {...pcm->ops &hw_ops;pcm->fd pcm->ops->open(card, device,…

tp5的tbmember表闭包查询 openid=‘abc‘ 并且(wx_unionid=null或者wx_unionid=‘‘)

闭包查询 tbmember表闭包查询查询 openid‘abc并且islose0并且islogout0并且(wx_unionidnull或者wx_unionid’) Db::table(tbmember)->where([openid>abc,islose>0,islogout>0])->where(function ($query){$query->where(wx_unioni…

邪修实战系列(3)

1、第一阶段邪修实战总览(9.1-9.30) 把第一阶段(基础夯实期)的学习计划拆解成极具操作性的每日行动方案。这个计划充分利用我“在职学习”的特殊优势,强调“用输出倒逼输入”,确保每一分钟的学习都直接服务…

【GD32】ROM Bootloader、自定义Bootloader区别

Bootloader是应用程序跑起来之前,用于初始化的一段程序,它分为两种,ROM Bootloader、自定义Bootloader。GD32芯片出厂时预烧录在ROM中的Bootloader(以下简称ROM Bootloader)和自己编写的Bootloader(以下简称…

Linux防火墙-Firewalld

一、 概述 按表现形式划分: 软件防火墙: 集成在系统内部,Linux系统: iptables、firewalld、ufw; windows系统下: windows defender 硬件防火墙: 华为防火墙、思科防火墙、奇安信防火墙、深信服防…

【Qt】PyQt、原生QT、PySide6三者的多方面比较

目录 引言 一、基本定义 二、核心对比维度 1. 编程语言与开发效率 2. 功能与 API 兼容性 3. 性能表现 4. 许可证与商业使用 5. 社区与文档支持 三、迁移与兼容性 四、适用场景推荐 五、总结对比表 总结 引言 PySide6、PyQt(通常指 PyQt5/PyQt6&#xf…

JavaWeb站内信系统 - 技术设计文档

1. 系统概述1.1 项目背景本系统旨在为企业或社区平台提供一套完整的站内信解决方案,支持用户之间的消息发送、接收、管理等功能,提升用户间的沟通效率。1.2 设计目标实现用户间消息发送和接收支持一对一和一对多消息发送提供消息状态跟踪(已读…

Java基础 9.10

1.System类常见方法和案例exit:退出当前程序arraycopy:复制数组元素,比较适合底层调用,一般使用 Arrays.copyOf 完成复制数组int[] src{1,2,3};int[] dest new int[3]; System.arraycopy(src, 0, dest, 0, 3);currentTimeMilens&…