简介:本资源为OpenJDK 17.0.1官方Linux解压即用安装包,面向Java开发者、运维工程师及高校教学场景,解决Linux环境下快速部署LTS版JDK的核心需求。压缩包共420个文件,含71个jmod模块文件(支撑JLink定制运行时)、70个license与assembly_exception法律声明文件、38个.so本地库(保障JVM底层调用)、31个.md文档(含API说明与构建指南),以及java、javac、jshell等完整开发工具链二进制文件,总大小179.46MB。目前已有1279人学习下载,资源结构规范、开箱可用,无需编译或额外依赖,特别适配x86_64架构服务器与容器化部署;预览可见jmxremote.access、cacerts、modules等关键安全与模块化配置文件,体现JDK 17对强封装、ZGC和密封类等新特性的完整支持,是搭建稳定Java 17开发/运行环境的可靠基础组件。
1. OpenJDK 17.01 Linux 解压安装包:不依赖包管理器的轻量级 JDK 部署方案
你正在维护一台生产环境的 CentOS 7 服务器,内网隔离、无 yum 源、无法联网下载 RPM 包;或者你在国产 Linux 发行版(如统信 UOS、麒麟 V10)上部署 Java 应用,系统自带 OpenJDK 版本老旧(如 11.0.2),而你的 Spring Boot 3.x 服务明确要求 JDK 17+。此时,openjdk-17.0.1_linux-x64_bin.tar.gz这类官方提供的解压即用型安装包,就成了最可靠、最可控的部署选择——它绕过包管理器锁死的版本、规避系统级 Java 环境冲突、避免alternatives --config java的权限风险,且能精确控制JAVA_HOME路径与PATH注入时机。本文聚焦 OpenJDK 17.01(注意:官方版本号为17.0.1,标题中“17.01”是常见笔误,实际指 17.0.1)在主流 Linux 发行版上的纯解压部署全流程,覆盖从下载校验、解压路径规划、环境变量注入,到多版本共存与启动验证的完整链路,所有操作均基于 Bash 命令行,无需 root 权限即可完成用户级部署。
2. 下载与校验:确认 openjdk-17.0.1-linux-x64_bin.tar.gz 的完整性与来源可信性
OpenJDK 17.0.1 是 LTS 版本,由 Adoptium(Eclipse Temurin)和 Oracle 官方同步发布。国内用户常因网络原因误用非官方镜像,导致 SHA256 校验失败或运行时出现UnsupportedClassVersionError。必须严格按官方渠道获取并验证。
2.1 获取官方下载地址与校验文件
Adoptium(推荐首选,开源社区维护,更新及时):
- 主下载页:https://adoptium.net/zh-CN/temurin/releases/?version=17
- 直接下载链接(x86_64, glibc):
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz - 对应 SHA256 校验文件:
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.sha256.txt
提示:不要使用
openjdk-17.0.1_linux-x64_bin.tar.gz这类模糊命名的第三方打包文件。Adoptium 的文件名包含jdk-17.0.1+12,其中+12表示构建版本号(build number),这是 OpenJDK 语义版本的重要组成部分,直接影响 JVM 补丁级别。
2.2 使用 wget 下载并执行 SHA256 校验(离线环境可预置)
# 创建专用目录存放 JDK 安装包 mkdir -p ~/software/jdk && cd ~/software/jdk # 下载 JDK tar.gz 包(请复制上方 Adoptium 直链) wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz # 下载对应 SHA256 校验文件 wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.sha256.txt # 提取校验值并验证(关键步骤!) expected_sha=$(cat OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.sha256.txt | cut -d' ' -f1) actual_sha=$(sha256sum OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz | cut -d' ' -f1) if [ "$expected_sha" = "$actual_sha" ]; then echo "✅ SHA256 校验通过:文件完整可信" else echo "❌ 校验失败!请删除文件并重新下载" exit 1 fi参数说明:
cut -d' ' -f1:以空格为分隔符,提取第一列(即哈希值),适配.sha256.txt文件标准格式(<hash> <filename>)sha256sum输出格式为<hash> <filename>,因此同样用cut -d' ' -f1提取哈希部分- 此校验逻辑兼容所有主流 Linux 发行版(CentOS/RHEL 7+, Ubuntu 18.04+, Debian 10+, 国产 UOS/Kylin)
2.3 验证 GPG 签名(高安全场景必选)
若部署环境属金融、政务等强合规场景,需额外验证 GPG 签名:
# 下载公钥(Adoptium 使用 Eclipse 基金会密钥) wget https://raw.githubusercontent.com/adoptium/infrastructure/master/signing/keys/adoptium-release-key.asc # 导入密钥 gpg --import adoptium-release-key.asc # 下载签名文件(.asc 后缀) wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.asc # 验证签名 gpg --verify OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz.asc OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz注意:GPG 验证输出中必须包含
Good signature from "Eclipse Foundation Release Signing Key"字样,且状态为primary key fingerprint: ...,才视为有效。
3. 解压与路径规划:避免 /opt 或 /usr 目录冲突,支持多版本共存
解压位置直接决定后续环境变量配置的稳定性。将 JDK 解压至/opt/java/或/usr/lib/jvm/是常见做法,但存在权限与升级风险;更健壮的做法是采用用户主目录下的版本化路径,既规避 root 权限依赖,又天然支持多 JDK 共存。
3.1 创建标准化解压路径并解压
# 创建版本化目录(路径含版本号,便于识别与切换) mkdir -p ~/jdk/17.0.1 # 解压到该目录(--strip-components=1 去除顶层目录,直接解出 jdk-17.0.1 目录) tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz \ -C ~/jdk/17.0.1 \ --strip-components=1 # 验证解压结果(检查 bin/java 是否可执行) ls -l ~/jdk/17.0.1/bin/java # 输出应类似:-rwxr-xr-x 1 user user 12345 Jun 15 2022 /home/user/jdk/17.0.1/bin/java关键参数解析:
--strip-components=1:原始 tar 包内层目录结构为jdk-17.0.1+12/...,此参数跳过第一级目录,使内容直接落入~/jdk/17.0.1/下,避免生成冗余嵌套路径(如~/jdk/17.0.1/jdk-17.0.1+12/)-C ~/jdk/17.0.1:指定解压目标根目录,确保所有文件落在此路径下- 解压后
~/jdk/17.0.1/目录结构应为:bin/,conf/,jmods/,lib/,man/等标准 JDK 子目录
3.2 建立符号链接实现版本抽象(解决硬编码路径问题)
当多个项目依赖不同 JDK 版本时,直接在脚本中写死~/jdk/17.0.1/bin/java极易出错。建立current符号链接,将具体版本与逻辑名称解耦:
# 删除旧链接(如有) rm -f ~/jdk/current # 创建指向 17.0.1 的 current 链接 ln -snf ~/jdk/17.0.1 ~/jdk/current # 验证链接有效性 ls -l ~/jdk/current # 输出应为:current -> /home/user/jdk/17.0.1提示:
ln -snf中-s表示软链接,-n避免对已存在目录的错误处理,-f强制覆盖。此链接可随时切换至其他版本(如ln -snf ~/jdk/21.0.1 ~/jdk/current),无需修改任何脚本。
3.3 验证 JDK 基础功能:java -version 与 javac 编译能力
# 直接调用解压后的 java 命令 ~/jdk/current/bin/java -version # 正确输出应为: # openjdk version "17.0.1" 2021-10-19 # OpenJDK Runtime Environment Temurin-17.0.1+12 (build 17.0.1+12) # OpenJDK 64-Bit Server VM Temurin-17.0.1+12 (build 17.0.1+12, mixed mode) # 测试 javac 编译器(生成一个最小 .class 文件) echo 'public class Hello { public static void main(String[] args) { System.out.println("OK"); } }' > Hello.java ~/jdk/current/bin/javac Hello.java ~/jdk/current/bin/java Hello # 输出应为:OK输出字段含义:
openjdk version "17.0.1":JDK 主版本号,确认为 17.0.1Temurin-17.0.1+12:构建标识,+12表示第 12 次构建,包含所有截至该日期的安全补丁mixed mode:JVM 运行模式(解释器 + JIT 编译),表明 HotSpot VM 正常工作
4. 环境变量配置:全局生效与用户级隔离的两种策略
JAVA_HOME和PATH的设置方式决定了 JDK 对当前 Shell、子进程及系统服务的可见范围。必须根据部署场景选择:开发机推荐用户级配置(~/.bashrc),生产服务器建议全局配置(/etc/profile.d/),且需规避update-alternatives的隐式干扰。
4.1 用户级配置(推荐开发/测试环境)
编辑~/.bashrc,追加以下内容:
# OpenJDK 17.0.1 配置(基于符号链接,便于切换) export JAVA_HOME="$HOME/jdk/current" export PATH="$JAVA_HOME/bin:$PATH"然后立即生效:
source ~/.bashrc验证:
echo $JAVA_HOME # 应输出 /home/yourname/jdk/current which java # 应输出 /home/yourname/jdk/current/bin/java java -version # 再次确认版本注意:
$HOME/jdk/current是相对路径,export JAVA_HOME="$HOME/jdk/current"比绝对路径export JAVA_HOME="/home/yourname/jdk/current"更具移植性,尤其在 NFS 共享家目录时。
4.2 全局级配置(推荐生产服务器)
创建独立配置文件,避免污染/etc/profile:
sudo tee /etc/profile.d/java17.sh << 'EOF' # OpenJDK 17.0.1 - Global Setup export JAVA_HOME="/home/deploy/jdk/current" # 注意:此处需替换为实际部署用户家目录 export PATH="$JAVA_HOME/bin:$PATH" EOF sudo chmod +x /etc/profile.d/java17.sh关键约束:
JAVA_HOME必须使用绝对路径,不能含$HOME变量(/etc/profile.d/在系统级 Shell 初始化时执行,$HOME未定义)- 若部署用户为
deploy,则路径为/home/deploy/jdk/current;若为appuser,则为/home/appuser/jdk/current - 所有新登录的用户(包括
sudo su -)将自动加载此配置
4.3 排查常见 PATH 冲突:为什么 which java 仍指向旧版本?
若执行which java返回/usr/bin/java,说明系统原有 JDK 优先级更高。排查顺序:
- 检查 PATH 顺序:
echo $PATH,确认$JAVA_HOME/bin是否排在/usr/bin之前 - 检查 shell 启动文件覆盖:
/etc/environment、/etc/profile、~/.profile中是否重复定义了JAVA_HOME - 检查 alias 干扰:
alias java查看是否有别名覆盖 - 验证 bash 登录模式:
bash -l -c 'echo $JAVA_HOME'模拟登录 Shell,确认全局配置是否生效
修复示例(强制 PATH 重排):
# 在 ~/.bashrc 末尾添加(确保最高优先级) export PATH="$HOME/jdk/current/bin:/usr/local/bin:/usr/bin:/bin"5. 进阶验证与生产就绪检查:JVM 参数、内存模型与无 javaws 的兼容性说明
OpenJDK 17 移除了javaws(Java Web Start),这是自 JDK 11 起逐步废弃的功能。若旧系统依赖 JNLP 启动,必须重构为本地 jar 启动或容器化部署。此外,17.0.1 的默认 GC 与内存模型已优化,需针对性验证。
5.1 检查 JVM 默认参数与 GC 类型
# 查看 JVM 启动时的默认参数(含 GC 选择) ~/jdk/current/bin/java -XX:+PrintCommandLineFlags -version 2>&1 | grep -E "(Use|Max|Initial)" # 典型输出: # -XX:+UseParallelGC -XX:InitialHeapSize=536870912 -XX:MaxHeapSize=8589934592 ...关键参数解读:
| 参数 | 含义 | OpenJDK 17.0.1 默认值 |
|---|---|---|
-XX:+UseParallelGC | 年轻代使用 Parallel GC(吞吐量优先) | ✅ 默认启用 |
-XX:InitialHeapSize | 初始堆大小(字节) | 约 1/64 物理内存 |
-XX:MaxHeapSize | 最大堆大小(字节) | 约 1/4 物理内存 |
-XX:+UseContainerSupport | 启用容器内存限制感知(Docker/K8s 场景必需) | ✅ 默认启用 |
提示:若运行于 Docker 容器中,务必验证
-XX:+UseContainerSupport是否生效,否则 JVM 可能无视--memory限制,导致 OOM Kill。
5.2 验证容器内存限制感知(Docker/K8s 场景)
# 在容器内执行(假设容器内存限制为 2G) docker run --rm -m 2g -v $(pwd):/work adoptium:17-jre-jammy java -XshowSettings:vm -version 2>&1 | grep -E "(MaxHeapSize|Container)" # 输出应包含: # MaxHeapSize: 536870912 (512.0MB) ← 明显小于 2G,证明容器限制被正确读取 # UseContainerSupport: true5.3 关于 javaws 的明确说明:OpenJDK 17.0.1 已彻底移除
执行~/jdk/current/bin/javaws将返回command not found。这是设计行为,非安装错误。替代方案:
- JNLP 文件转本地启动:提取 JNLP 中的
href属性,下载主 jar 包,用java -jar app.jar启动 - Web Start 功能迁移:使用现代框架如 Electron 封装前端 + Spring Boot REST API
- 企业级替代:采用 JavaFX + 自更新机制,或迁移到 GraalVM Native Image 生成独立二进制
注意:标题中“openjdk 无javaws”是准确描述,非缺陷。所有基于 OpenJDK 11+ 的发行版(包括 Temurin、Liberica、Zulu)均不再提供
javaws,这是 Java 平台演进的必然结果。
5.4 生产环境必备检查清单(可直接执行)
# 1. JDK 版本与构建号 java -version | head -n1 # 2. JAVA_HOME 是否指向解压路径 echo $JAVA_HOME | grep -q "jdk/current" && echo "✅ JAVA_HOME 正确" || echo "❌ JAVA_HOME 错误" # 3. java 命令是否来自预期路径 which java | grep -q "jdk/current/bin/java" && echo "✅ PATH 正确" || echo "❌ PATH 错误" # 4. JVM 是否识别容器限制(如适用) java -XX:+PrintFlagsFinal -version 2>&1 | grep -E "UseContainerSupport|MaxHeapSize" | grep -E "=.*true|=[0-9]+" # 5. 关键工具是否存在(javac, jstack, jmap) for cmd in javac jstack jmap; do if command -v "$cmd" >/dev/null 2>&1; then echo "✅ $cmd available" else echo "❌ $cmd missing" fi done执行后应全部输出✅,任一❌即需回溯前序步骤。此清单可集成至 CI/CD 部署脚本,作为 JDK 部署成功的自动化验收标准。
本文还有配套的精品资源,点击获取