Linux手动部署Oracle JDK 17的完全指南

 更新时间:2026年05月31日 09:11:19   作者:Java小白笔记  
本文手把手教你在 Linux 系统上通过官方 tar.gz 压缩包手动安装 Oracle JDK 17,涵盖旧版清理、下载解压、环境变量配置、多版本管理及常见问题排查,适用于 Ubuntu / CentOS / Debian 等主流发行版,需要的朋友可以参考下

一、为什么选择手动安装?

在 Linux 上安装 Java 开发工具包(JDK)有多种方式:

方式命令示例优点缺点
包管理器安装apt install openjdk-17-jdk一键安装,自动处理依赖版本固定,通常是 OpenJDK
SDKMAN 管理sdk install java 17多版本切换方便需要额外工具链
手动 tar.gz 安装本文方法版本精确可控,Oracle 官方原版需手动配置

手动安装的核心优势:

  1. 版本精确 — 可以安装 Oracle JDK 的任意小版本(如 17.0.12)
  2. 环境纯净 — 不会和系统包管理器的 OpenJDK 产生冲突
  3. 可移植性高 — 配置脚本可以直接复用到 CI/CD 流水线或 Docker 镜像中

二、环境准备

2.1 确认系统信息

安装前先了解当前系统的架构和版本,确保下载正确的安装包。

# 查看 CPU 架构(x86_64 或 aarch64)
uname -m

# 查看操作系统版本
cat /etc/os-release

# 查看当前是否已安装 Java
java -version 2>&1 || echo "未安装 Java"

输出示例:

x86_64
PRETTY_NAME="Ubuntu 22.04.3 LTS"
openjdk version "11.0.21" 2023-10-17
OpenJDK Runtime Environment (build 11.0.21+9-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.21+9-Ubuntu-0ubuntu122.04, mixed mode, sharing)

上面输出一台典型的 Ubuntu 22.04 服务器,已预装 OpenJDK 11,CPU 为 x86_64 架构。

2.2 检查磁盘空间

JDK 17 完整安装大约占用 300MB ~ 400MB 磁盘空间。

df -h /opt

确保 /opt 或你打算安装的目录至少有 1GB 可用空间。

三、清理残留的 Java 环境

如果你的系统中已经存在旧版 Java(OpenJDK 或其他版本的 JDK),建议先彻底清理,避免路径冲突。

3.1 查找已安装的 Java 包

# Ubuntu / Debian 系
dpkg -l | grep -i java

# CentOS / RHEL 系
rpm -qa | grep -i java

3.2 卸载旧版 Java

# Ubuntu / Debian 系
sudo apt-get remove --purge openjdk-*
sudo apt-get autoremove

# CentOS / RHEL 系
sudo yum remove java-11-openjdk*
sudo yum remove java-1.8.0-openjdk*

3.3 清理残留文件

有时包管理器卸载后会残留配置文件或软链接:

# 查找可能残留的 Java 相关文件
sudo find /usr/lib/jvm -name "*java*" 2>/dev/null
sudo find /etc -name "*java*" 2>/dev/null

# 确认无误后清理(⚠️ 谨慎操作!务必核对路径)
sudo rm -rf /usr/lib/jvm/java-*
sudo rm -f /etc/profile.d/jdk.sh

危险警告:执行 rm 命令前务必用 find 确认路径正确!误删系统组件可能导致系统异常。不确定时跳过此步,直接覆盖安装即可。

3.4 清除旧的环境变量

检查并清理 ~/.bashrc~/.zshrc/etc/profile 中关于 JAVA_HOME 的配置行:

# 查看包含 JAVA_HOME 的行
grep -n "JAVA_HOME" ~/.bashrc ~/.zshrc /etc/profile 2>/dev/null

如果有残留行,先注释掉或删除,等安装完成后再统一配置。

四、下载 Oracle JDK 17

4.1 获取下载链接

访问 Oracle Java 下载页面,找到 JDK 17 LTS 版本。

版本注意

  • 17.0.12 及更早版本:可直接下载,无需登录
  • 17.0.13 及更新版本:需要 Oracle 账号并同意 OTN 许可协议
  • 归档版本查看:Java SE 17 Archive Downloads

4.2 使用 wget 命令行下载

# x86_64 架构(最常见)
wget --no-cookie --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" \
     "https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz"

# aarch64 / ARM 架构
wget --no-cookie --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" \
     "https://download.oracle.com/java/17/latest/jdk-17_linux-aarch64_bin.tar.gz"

--no-check-certificate 用于跳过 SSL 证书验证(某些内网环境需要),--header 用于自动接受许可协议。

4.3 验证下载完整性

# 查看文件大小(正常应在 190MB 左右)
ls -lh jdk-17_linux-x64_bin.tar.gz

# 计算 MD5 校验值,与官网提供的进行比对
md5sum jdk-17_linux-x64_bin.tar.gz

五、解压安装

5.1 选择安装位置

Linux 系统常用的 Java 安装位置有:

位置适用场景权限要求
/opt/java/推荐,独立管理root
/usr/lib/jvm/传统位置,兼容性好root
/usr/local/本地编译安装root

本文以 /opt/java/ 为例:

# 创建安装目录
sudo mkdir -p /opt/java

# 移动安装包到安装目录
sudo mv jdk-17_linux-x64_bin.tar.gz /opt/java/

# 进入安装目录
cd /opt/java

5.2 解压 tar.gz 包

# 解压(会自动创建 jdk-17.0.x 子目录)
sudo tar -zxvf jdk-17_linux-x64_bin.tar.gz

# 查看解压结果
ls -la /opt/java/

典型输出:

drwxr-xr-x  13 root root   4096 May 15 10:30 jdk-17.0.12
-rw-r--r--   1 root root 198M May 15 10:28 jdk-17_linux-x64_bin.tar.gz

5.3 清理安装包(可选)

# 解压完成后可以删除压缩包节省空间
sudo rm jdk-17_linux-x64_bin.tar.gz

5.4 安装结果示意

digraph jdk_install {
    rankdir=LR;
    node [shape=box, style=filled, fillcolor="#e8f4f8"];
    
    "tar.gz 压缩包" -> "tar -zxvf" -> "jdk-17.0.12/ 目录";
    "jdk-17.0.12/" -> "bin/       [java/javac/jdb]";
    "jdk-17.0.12/" -> "lib/       [核心类库]";
    "jdk-17.0.12/" -> "jre/       [运行时环境]";
    "jdk-17.0.12/" -> "conf/      [配置文件]";
}

六、配置环境变量

这是最关键的一步。环境变量配置方式有三种,按推荐使用程度排序:

6.1 方式一:/etc/profile.d/(推荐)

这种方式只影响 Java 相关配置,不会污染主配置文件,且对所有用户生效。

# 创建独立的 Java 配置文件
sudo vim /etc/profile.d/jdk.sh

写入以下内容:

# Oracle JDK 17 环境变量配置
export JAVA_HOME=/opt/java/jdk-17.0.12
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

重要:请将 /opt/java/jdk-17.0.12 替换为你实际的解压目录名!可以用 ls /opt/java/ 确认。

使配置立即生效:

source /etc/profile.d/jdk.sh

6.2 方式二:修改/etc/profile(所有用户)

sudo vim /etc/profile

在文件末尾追加:

# Oracle JDK 17
export JAVA_HOME=/opt/java/jdk-17.0.12
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib
source /etc/profile

6.3 方式三:修改~/.bashrc(仅当前用户)

vim ~/.bashrc

在文件末尾追加:

# Oracle JDK 17
export JAVA_HOME=/opt/java/jdk-17.0.12
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib
source ~/.bashrc

6.4 三种方式对比

对比项profile.d//etc/profile~/.bashrc
作用范围所有用户所有用户仅当前用户
维护性优秀(独立文件)一般(混在主配置中)良好
Shell 兼容bash + zshbash + zshbash + zsh
推荐度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

七、验证安装

7.1 基础验证

# 检查 java 命令版本
java -version

# 预期输出:
# java version "17.0.12" 2024-07-16 LTS
# Java(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)
# Java HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)

# 检查 javac 编译器版本
javac -version

# 预期输出:
# javac 17.0.12

# 确认 JAVA_HOME 正确设置
echo $JAVA_HOME

# 预期输出:
# /opt/java/jdk-17.0.12

7.2 运行测试程序

创建一个简单的 Java 文件验证编译和运行是否正常:

// 创建测试文件
cat > Test.java << 'EOF'
public class Test {
    public static void main(String[] args) {
        System.out.println("Hello from JDK " + System.getProperty("java.version"));
        System.out.println("OS: " + System.getProperty("os.name"));
        
        // 测试 StringJoiner(JDK 17 内置 API)
        java.util.StringJoiner sj = new java.util.StringJoiner(", ");
        sj.add("Oracle").add("JDK").add("17");
        System.out.println(sj);
    }
}
EOF

# 编译
javac Test.java

# 运行
java Test

# 预期输出:
# Hello from JDK 17.0.12
# OS: Linux
# Oracle, JDK, 17

# 清理测试文件
rm Test.java Test.class

7.3 验证流程图

graph LR
    A["source /etc/profile"] --> B["java -version"]
    B --> C{"版本是否为 17?"}
    C -->|"是"| D["javac -version"]
    C -->|"否"| E["检查 JAVA_HOME 路径"]
    E --> F["修正环境变量"]
    F --> B
    D --> G{"版本是否为 17?"}
    G -->|"是"| H["✅ 安装成功"]
    G -->|"否"| E

八、多 JDK 版本管理

服务器上往往需要同时存在多个 JDK 版本(比如项目 A 用 JDK 8,项目 B 用 JDK 17)。

8.1 使用 update-alternatives 统一管理

# 注册 JDK 17
sudo update-alternatives --install /usr/bin/java java /opt/java/jdk-17.0.12/bin/java 1700
sudo update-alternatives --install /usr/bin/javac javac /opt/java/jdk-17.0.12/bin/javac 1700
sudo update-alternatives --install /usr/bin/jar jar /opt/java/jdk-17.0.12/bin/jar 1700

# 如果还有 JDK 8,也注册进去
sudo update-alternatives --install /usr/bin/java java /opt/java/jdk-1.8.0/bin/java 1800

# 查看已注册的版本列表
sudo update-alternatives --list java

# 交互式切换版本
sudo update-alternatives --config java

# 分别配置 javac 和 jar
sudo update-alternatives --config javac
sudo update-alternatives --config jar

8.2 优先级数字说明

数字越大,优先级越高
1700 → JDK 17
1800 → JDK 8

当数字相同时,最后注册的版本成为默认

8.3 版本切换流程

flowchart TD
    A["需要切换 JDK 版本"] --> B["update-alternatives --config java"]
    B --> C["输入对应编号"]
    C --> D["source /etc/profile"]
    D --> E["java -version 验证"]
    E --> F["重启相关服务"]
    
    subgraph 常见场景
        G["部署新项目 → 切到高版本"]
        H["回滚上线 → 切到低版本"]
        I["并行测试 → 不切换"]
    end
    
    A --> G
    A --> H
    A --> I

8.4 按项目动态切换(进阶)

不想全局切换时,可以在项目启动脚本中临时指定:

#!/bin/bash
# deploy.sh — 项目专属 JDK

export JAVA_HOME=/opt/java/jdk-17.0.12
export PATH=$JAVA_HOME/bin:$PATH

echo "使用 ${JAVA_HOME} 启动应用..."
java -jar /opt/apps/myapp.jar

九、Docker 中使用 Oracle JDK 17

如果你使用 Docker,可以参考以下 Dockerfile:

# 基于官方 JDK 17 镜像(最简单的方式)
FROM eclipse-temurin:17-jre

# 或者手动安装 Oracle JDK 17
FROM ubuntu:22.04

COPY jdk-17_linux-x64_bin.tar.gz /tmp/

RUN mkdir -p /opt/java && \
    tar -zxvf /tmp/jdk-17_linux-x64_bin.tar.gz -C /opt/java && \
    rm /tmp/jdk-17_linux-x64_bin.tar.gz && \
    echo 'export JAVA_HOME=/opt/java/jdk-17.0.12' > /etc/profile.d/jdk.sh && \
    echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/jdk.sh

ENV JAVA_HOME=/opt/java/jdk-17.0.12
ENV PATH=$JAVA_HOME/bin:$PATH

WORKDIR /app
COPY target/myapp.jar /app/

CMD ["java", "-jar", "myapp.jar"]

十、常见问题排查

10.1 java: command not found

# 原因:环境变量未生效或未正确配置

# 检查 1:确认 java 二进制文件存在
ls -l /opt/java/jdk-17.0.12/bin/java

# 检查 2:确认 JAVA_HOME 已设置
echo $JAVA_HOME

# 检查 3:手动 source 配置文件
source /etc/profile.d/jdk.sh

# 检查 4:查看 PATH 是否包含 JAVA_HOME/bin
echo $PATH | tr ':' '\n' | grep java

10.2 版本不对(显示的是 OpenJDK)

# 原因:系统 PATH 中其他 Java 路径排在前面

# 查找所有 java 可执行文件
which -a java

# 预期应该只有 /opt/java/jdk-17.0.12/bin/java

# 如果有其他路径,检查 /usr/bin/ 下的软链接
ls -l /usr/bin/java
sudo update-alternatives --set java /opt/java/jdk-17.0.12/bin/java

10.3 中文乱码

# 原因:Linux 容器中没有中文字体包

# Ubuntu / Debian
sudo apt-get install -y fonts-wqy-microhei fonts-wqy-zenhei

# CentOS / RHEL
sudo yum install -y wqy-microhei-fonts

10.4 Permission Denied

# 原因:解压后的文件没有执行权限

sudo chmod +x /opt/java/jdk-17.0.12/bin/*

10.5 问题速查表

报错信息原因解决方案
command not found环境变量未配置source /etc/profile.d/jdk.sh
版本号不是 17系统有其他 Javaupdate-alternatives --config java
Unable to init server无图形环境服务器环境不需要 GUI,忽略即可
中文乱码缺少字体包安装 fonts-wqy-microhei
Permission denied文件无执行权限chmod +x bin/*

十一、总结

安装步骤回顾

sequenceDiagram
    participant U as 开发者
    participant S as 服务器
    
    U->>S: 1. 检查环境与旧版本
    S-->>U: 返回系统信息和已安装 Java
    U->>S: 2. 清理旧版 Java
    S-->>U: 确认清理干净
    U->>S: 3. 下载 JDK 17 tar.gz
    S-->>U: 下载完成
    U->>S: 4. 解压到 /opt/java/
    S-->>U: 解压成功
    U->>S: 5. 配置 /etc/profile.d/jdk.sh
    S-->>U: 配置已写入
    U->>S: 6. source 使配置生效
    S-->>U: 生效成功
    U->>S: 7. java -version 验证
    S-->>U: ✅ java version "17.0.x"
步骤关键命令耗时
检查环境java -version10s
清理旧版apt-get remove1-3min
下载安装wget2-5min(视网速)
解压安装tar -zxvf30s
配置环境变量vim + source30s
验证java -version10s

核心要点

  1. 先清理再安装 — 避免版本冲突,但删除前务必确认路径
  2. 安装位置要统一 — 推荐 /opt/java/,保持系统整洁
  3. 环境变量用独立文件/etc/profile.d/jdk.sh 比改 /etc/profile 更易维护
  4. 路径替换别遗漏 — 把示例中的 jdk-17.0.12 换成实际目录名
  5. 多用 update-alternatives — 多版本管理的标准做法

以上就是Linux手动部署Oracle JDK 17的完全指南的详细内容,更多关于Linux手动部署Oracle JDK 17的资料请关注脚本之家其它相关文章!

相关文章

  • linux下修改MAC地址问题解决方法

    linux下修改MAC地址问题解决方法

    在linux中,修改MAC地址(修改的MAC地址跟原来的地址不同),接下来为大家介绍下修改MAC地址时所遇到的问题,感兴趣的朋友可以参考下哈
    2013-04-04
  • CentOS下停止Tomcat运行脚本代码

    CentOS下停止Tomcat运行脚本代码

    这篇文章主要介绍了CentOS下停止Tomcat运行脚本代码,需要的朋友可以参考下
    2014-11-11
  • Linux系统中swap分区的设置与增加/删除

    Linux系统中swap分区的设置与增加/删除

    我们都知道在安装Linux系统时在分区时可以分配swap分区,而系统安装后(在运行中)如何建立或调整swap分区呢?下面这篇文章主要给大家介绍了关于Linux系统中swap分区的设置与增加/删除的相关资料,需要的朋友可以参考下
    2018-07-07
  • 本地与linux互传文件的方式详解

    本地与linux互传文件的方式详解

    实现本地与Linux服务器文件互传的常用方式:scp命令、sftp命令、lrzsz程序,xftp软件,下面就跟随小编一起来学习一下如何具体操作的吧
    2023-08-08
  • Linux常用命令之grep命令用法详解

    Linux常用命令之grep命令用法详解

    这篇文章主要介绍了Linux常用命令grep命令用法详解,grep命令用于对文件和文本执行重复搜索任务的Unix工具,可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。对此感兴趣可以了解一下
    2020-07-07
  • linux的网络通信和进程间通信解读

    linux的网络通信和进程间通信解读

    Linux中进程间通信(IPC)用于同一主机的高效数据交换,网络通信支持跨主机的灵活传输,IPC适用于本地高可靠场景,网络通信适合分布式系统,选择依据为性能需求和通信范围,混合架构可结合Unix Domain Socket优化效率
    2025-09-09
  • centos 7 安装配置方法图文教程

    centos 7 安装配置方法图文教程

    这篇文章主要为大家详细介绍了centos 7 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 让Apache 2支持.htaccess并实现目录加密的方法

    让Apache 2支持.htaccess并实现目录加密的方法

    这篇文章主要介绍了让Apache 2支持.htaccess并实现目录加密的方法,文中给出了详细的方法步骤,并给出了示例代码,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • linux系统中通过rsync+inotify实现网页自动同步

    linux系统中通过rsync+inotify实现网页自动同步

    这篇文章主要介绍了linux系统中通过rsync+inotify实现网页自动同步,需要的朋友可以参考下
    2014-11-11
  • 浅谈linux下的一些常用函数的总结(必看篇)

    浅谈linux下的一些常用函数的总结(必看篇)

    下面小编就为大家带来一篇浅谈linux下的一些常用函数的总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10

最新评论