Linux手动部署Oracle JDK 17的完全指南
一、为什么选择手动安装?
在 Linux 上安装 Java 开发工具包(JDK)有多种方式:
| 方式 | 命令示例 | 优点 | 缺点 |
|---|---|---|---|
| 包管理器安装 | apt install openjdk-17-jdk | 一键安装,自动处理依赖 | 版本固定,通常是 OpenJDK |
| SDKMAN 管理 | sdk install java 17 | 多版本切换方便 | 需要额外工具链 |
| 手动 tar.gz 安装 | 本文方法 | 版本精确可控,Oracle 官方原版 | 需手动配置 |
手动安装的核心优势:
- 版本精确 — 可以安装 Oracle JDK 的任意小版本(如 17.0.12)
- 环境纯净 — 不会和系统包管理器的 OpenJDK 产生冲突
- 可移植性高 — 配置脚本可以直接复用到 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 + zsh | bash + zsh | bash + 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 | 系统有其他 Java | update-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 -version | 10s |
| 清理旧版 | apt-get remove | 1-3min |
| 下载安装 | wget | 2-5min(视网速) |
| 解压安装 | tar -zxvf | 30s |
| 配置环境变量 | vim + source | 30s |
| 验证 | java -version | 10s |
核心要点
- 先清理再安装 — 避免版本冲突,但删除前务必确认路径
- 安装位置要统一 — 推荐
/opt/java/,保持系统整洁 - 环境变量用独立文件 —
/etc/profile.d/jdk.sh比改/etc/profile更易维护 - 路径替换别遗漏 — 把示例中的
jdk-17.0.12换成实际目录名 - 多用 update-alternatives — 多版本管理的标准做法
以上就是Linux手动部署Oracle JDK 17的完全指南的详细内容,更多关于Linux手动部署Oracle JDK 17的资料请关注脚本之家其它相关文章!
相关文章
让Apache 2支持.htaccess并实现目录加密的方法
这篇文章主要介绍了让Apache 2支持.htaccess并实现目录加密的方法,文中给出了详细的方法步骤,并给出了示例代码,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。2017-02-02
linux系统中通过rsync+inotify实现网页自动同步
这篇文章主要介绍了linux系统中通过rsync+inotify实现网页自动同步,需要的朋友可以参考下2014-11-11


最新评论