
在当今的软件开发和部署领域,java 依然是企业级应用、后端服务、大数据处理乃至 android 应用开发的主流语言之一。而 linux 系统作为服务器操作系统的首选,其稳定、安全、开源的特性使其成为 java 应用部署的天然温床。然而,要让 java 应用在 linux 上顺利运行,第一步也是最关键的一步——正确安装 jdk(java development kit)并配置好环境变量。
本文将带你从零开始,在主流 linux 发行版(如 ubuntu、centos、debian 等)上完成 jdk 的安装与环境变量配置,并通过实际的 java 代码示例验证安装是否成功。我们将涵盖多种安装方式(包括包管理器安装、手动下载安装、使用 sdkman! 等),深入讲解环境变量的作用机制,分析常见问题,并提供最佳实践建议。无论你是刚入门的开发者,还是需要部署生产环境的运维工程师,本文都将为你提供清晰、可靠、可复现的操作指南。
为什么需要正确安装 jdk?
jdk 不仅仅是 java 编译器(javac)和运行时(jre)的集合,它还包含调试工具、文档生成器(javadoc)、性能监控工具(如 jconsole、jvisualvm)等开发必备组件。在 linux 系统中,若未正确安装 jdk 或环境变量配置错误,你可能会遇到以下问题:
- 执行
java或javac命令时提示 “command not found” - 构建工具(如 maven、gradle)无法识别 java 版本
- 应用程序启动失败,报错 “no java runtime present”
- 多个 java 版本共存时,系统调用的是错误版本
因此,理解 jdk 的安装原理和环境变量的配置逻辑,是保障 java 应用稳定运行的基础。
linux 系统中常见的 jdk 发行版
在安装之前,我们需要了解目前主流的 jdk 发行版。oracle jdk 曾是官方标准,但自 java 11 起,oracle 改变了其许可策略,对商业用途收取费用。因此,社区和企业越来越多地转向开源且免费的替代品:
- openjdk:由 openjdk 社区维护,是 java se 的官方开源实现。大多数 linux 发行版默认提供 openjdk。
- adoptium (eclipse temurin):由 eclipse 基金会支持,提供经过严格测试的 openjdk 构建,被广泛用于生产环境。
- amazon corretto:aws 提供的 openjdk 发行版,长期支持且免费。
- azul zulu:azul systems 提供的 openjdk 构建,支持多种平台。
- microsoft build of openjdk:微软提供的 openjdk 构建,适用于 azure 和其他云环境。
💡 建议:对于大多数用户,推荐使用 openjdk 或 eclipse temurin,它们完全开源、免费,且兼容性良好。
你可以通过 adoptium 官网 获取 temurin 的最新版本,或通过 openjdk 官网 了解官方信息。
方法一:使用系统包管理器安装 openjdk(推荐初学者)
这是最简单、最安全的方式,尤其适合快速搭建开发或测试环境。不同发行版的包管理器命令略有不同。
在 ubuntu/debian 系统上
# 更新软件包列表 sudo apt update # 查看可用的 openjdk 版本 apt list openjdk* # 安装 openjdk 17(当前 lts 版本) sudo apt install openjdk-17-jdk -y # 验证安装 java -version javac -version
执行 java -version 后,你可能会看到类似输出:
openjdk version "17.0.12" 2024-07-16
openjdk runtime environment (build 17.0.12+7-ubuntu-122.04.1)
openjdk 64-bit server vm (build 17.0.12+7-ubuntu-122.04.1, mixed mode, sharing)
在 centos/rhel/rocky linux 系统上
# 对于 centos 7(使用 yum) sudo yum install java-17-openjdk-devel -y # 对于 centos 8+/rocky linux(使用 dnf) sudo dnf install java-17-openjdk-devel -y # 验证 java -version
📌 注意:
-devel后缀表示包含开发工具(如javac),仅安装java-17-openjdk只会安装 jre,无法编译 java 代码。
方法二:手动下载并安装 jdk(适用于生产环境或特定版本需求)
当你需要安装特定版本(如 oracle jdk、temurin、corretto)或系统包管理器未提供所需版本时,手动安装是更好的选择。
步骤 1:下载 jdk 压缩包
以 eclipse temurin jdk 17 为例:
# 进入临时目录 cd /tmp # 使用 wget 下载(以 x64 linux 为例) wget https://github.com/adoptium/temurin17-binaries/releases/latest/download/openjdk17u-jdk_x64_linux_hotspot_17.0.12_7.tar.gz
🔗 你可以从 adoptium releases 页面 选择适合你架构的版本。
步骤 2:解压到指定目录
通常将 jdk 安装到 /usr/lib/jvm/ 目录下(这是 linux 系统约定的 java 安装位置):
# 创建 jvm 目录(如果不存在) sudo mkdir -p /usr/lib/jvm # 解压 sudo tar -xzf openjdk17u-jdk_x64_linux_hotspot_17.0.12_7.tar.gz -c /usr/lib/jvm/ # 重命名目录以便引用(可选但推荐) sudo mv /usr/lib/jvm/jdk-17.0.12+7 /usr/lib/jvm/temurin-17
步骤 3:配置环境变量
这是关键一步!我们需要设置 java_home 并将 jdk 的 bin 目录加入 path。
编辑全局环境变量文件(对所有用户生效):
sudo nano /etc/environment
在文件末尾添加:
java_home="/usr/lib/jvm/temurin-17"
然后编辑 /etc/profile 或创建一个专用的 profile 文件:
sudo nano /etc/profile.d/java.sh
写入以下内容:
export java_home=/usr/lib/jvm/temurin-17 export path=$java_home/bin:$path
保存后,使配置生效:
source /etc/profile
或者,如果你只想为当前用户配置,可以编辑 ~/.bashrc 或 ~/.zshrc:
echo 'export java_home=/usr/lib/jvm/temurin-17' >> ~/.bashrc echo 'export path=$java_home/bin:$path' >> ~/.bashrc source ~/.bashrc
验证安装
echo $java_home # 应输出:/usr/lib/jvm/temurin-17 java -version javac -version
如果一切正常,说明手动安装成功!
方法三:使用 sdkman! 管理多个 jdk 版本(开发者利器)
如果你经常需要在不同 java 版本之间切换(例如同时开发 java 8 和 java 21 项目),sdkman! 是一个极佳的工具。它是一个命令行工具,用于管理 java、groovy、kotlin 等 sdk 的多个版本。
安装 sdkman!
curl -s "https://get.sdkman.io" | bash source "$home/.sdkman/bin/sdkman-init.sh"
使用 sdkman! 安装 jdk
# 列出可用的 java 版本 sdk list java # 安装 temurin jdk 17 sdk install java 17-tem # 安装 openjdk 21 sdk install java 21-open # 设置默认版本 sdk default java 17-tem # 临时切换版本(仅当前 shell 会话) sdk use java 21-open
sdkman! 会自动配置 java_home 和 path,无需手动编辑配置文件。这对于多版本开发场景非常友好。
🔗 了解更多:sdkman! 官网
环境变量详解:java_home 与 path
很多初学者对 java_home 和 path 的作用感到困惑。下面详细解释:
path 是什么?
path 是一个环境变量,包含一系列目录路径。当你在终端输入一个命令(如 java),系统会依次在 path 中列出的目录中查找对应的可执行文件。
例如,path 可能包含:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
如果你将 $java_home/bin 加入 path,那么 java 和 javac 就能在任何目录下被调用。
java_home 是什么?
java_home 并不是系统必需的变量,但它被大量 java 工具和框架依赖,例如:
- apache tomcat
- maven
- gradle
- spring boot
- jenkins
这些工具通过读取 java_home 来确定 jdk 的安装位置,从而调用正确的 java 或 javac。如果没有设置 java_home,它们可能无法启动或使用错误的 java 版本。
验证环境变量是否生效
# 查看 java_home echo $java_home # 查看 java 命令的实际路径 which java # 查看 javac 命令的实际路径 which javac
理想情况下,which java 应返回 $java_home/bin/java。
编写并运行第一个 java 程序
现在 jdk 已安装并配置完毕,让我们编写一个简单的 java 程序来验证一切正常。
创建 java 源文件
nano helloworld.java
写入以下代码:
public class helloworld {
public static void main(string[] args) {
system.out.println("🎉 hello, linux java world!");
system.out.println("java version: " + system.getproperty("java.version"));
system.out.println("java home: " + system.getproperty("java.home"));
system.out.println("os: " + system.getproperty("os.name") + " " + system.getproperty("os.version"));
}
}编译并运行
# 编译 javac helloworld.java # 运行 java helloworld
预期输出:
🎉 hello, linux java world!
java version: 17.0.12
java home: /usr/lib/jvm/temurin-17
os: linux 5.15.0-101-generic
✅ 成功!这表明你的 jdk 安装和环境变量配置完全正确。
多 jdk 版本共存与切换
在实际工作中,你可能需要同时维护多个 java 项目,分别基于 java 8、11、17 或 21。如何优雅地管理多个 jdk?
方案 1:使用update-alternatives(debian/ubuntu)
linux 提供了 update-alternatives 工具来管理同一命令的多个实现。
假设你已安装了 openjdk 11 和 openjdk 17:
# 注册 java 命令的多个版本 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/temurin-17/bin/java 2 # 注册 javac sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-11-openjdk-amd64/bin/javac 1 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/temurin-17/bin/javac 2 # 交互式选择默认版本 sudo update-alternatives --config java sudo update-alternatives --config javac
系统会列出所有注册的版本,你可以通过数字选择默认版本。
方案 2:使用 sdkman!(推荐)
如前所述,sdkman! 提供了更简洁的版本切换体验:
sdk use java 11-open # 临时切换 sdk default java 17-tem # 永久默认
方案 3:项目级配置(maven/gradle)
现代构建工具允许你在项目级别指定 java 版本,而不依赖系统全局设置。
maven 示例(pom.xml)
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.release>17</maven.compiler.release>
</properties>gradle 示例(build.gradle)
java {
toolchain {
languageversion = javalanguageversion.of(17)
}
}这样,即使系统默认是 java 11,maven/gradle 也会使用指定的 jdk 17 来编译项目。
常见问题排查
问题 1:java: command not found
原因:path 未包含 jdk 的 bin 目录。
解决:
- 检查
echo $path是否包含$java_home/bin - 确认
java_home是否正确设置 - 重新加载配置文件:
source ~/.bashrc或source /etc/profile
问题 2:java_home is not set
原因:某些工具(如 tomcat)启动脚本检测不到 java_home。
解决:
- 在启动脚本中显式设置
java_home,或 - 确保
java_home在全局环境变量中定义(如/etc/environment)
问题 3:版本不匹配
执行 java -version 显示的是旧版本,但你已安装新版本。
原因:path 中旧版本的路径排在前面。
解决:
- 使用
which java查看实际调用的路径 - 调整
path顺序,确保新 jdk 的bin目录优先 - 使用
update-alternatives或 sdkman! 统一管理
问题 4:权限问题
解压 jdk 到 /usr/lib/jvm/ 时提示权限不足。
解决:使用 sudo 执行解压命令,或选择用户目录(如 ~/jdk)安装。
生产环境最佳实践
在生产服务器上部署 java 应用时,应遵循以下原则:
- 使用 lts 版本:java 8、11、17、21 是长期支持版本,适合生产环境。
- 避免使用 oracle jdk(除非有商业许可):优先选择 openjdk 或 temurin。
- 固定 jdk 版本:不要使用 “latest” 链接,应指定具体版本号,确保可重现性。
- 最小化安装:只安装
jre(如果不需要编译),减少攻击面。 - 定期更新:关注安全补丁,及时升级 jdk。
- 使用容器化:通过 docker 封装 jdk 和应用,避免环境差异。
例如,一个典型的生产 dockerfile:
from eclipse-temurin:17-jre copy myapp.jar /app/myapp.jar cmd ["java", "-jar", "/app/myapp.jar"]
这样,jdk 的安装和配置被封装在镜像中,无需在宿主机上操作。
环境变量配置流程图
为了更直观地理解 jdk 安装后的环境变量配置逻辑,我们用 mermaid 绘制一个流程图:


该流程图展示了从安装到验证的完整路径,帮助你快速定位问题所在。
自动化脚本示例
为了简化重复部署,你可以编写一个 shell 脚本来自动安装和配置 jdk。
#!/bin/bash
# install-jdk.sh - 自动安装 openjdk 17 并配置环境变量
set -e # 遇错退出
echo "🔧 开始安装 openjdk 17..."
# 检测发行版
if command -v apt &> /dev/null; then
echo "📦 使用 apt 安装..."
sudo apt update
sudo apt install -y openjdk-17-jdk
elif command -v dnf &> /dev/null; then
echo "📦 使用 dnf 安装..."
sudo dnf install -y java-17-openjdk-devel
elif command -v yum &> /dev/null; then
echo "📦 使用 yum 安装..."
sudo yum install -y java-17-openjdk-devel
else
echo "❌ 不支持的包管理器"
exit 1
fi
# 获取 java_home 路径(适用于 ubuntu/debian)
if [ -d "/usr/lib/jvm/java-17-openjdk-amd64" ]; then
java_home_path="/usr/lib/jvm/java-17-openjdk-amd64"
elif [ -d "/usr/lib/jvm/java-17-openjdk" ]; then
java_home_path="/usr/lib/jvm/java-17-openjdk"
else
echo "⚠️ 无法自动确定 java_home,尝试手动设置"
exit 1
fi
# 写入环境变量
echo "export java_home=$java_home_path" >> ~/.bashrc
echo "export path=\$java_home/bin:\$path" >> ~/.bashrc
# 重新加载
source ~/.bashrc
echo "✅ openjdk 17 安装完成!"
java -version将上述脚本保存为 install-jdk.sh,赋予执行权限后运行:
chmod +x install-jdk.sh ./install-jdk.sh
总结
在 linux 系统上安装 jdk 并配置环境变量,看似简单,实则涉及操作系统、环境变量、软件包管理等多个层面的知识。通过本文,你已经掌握了:
- 三种主流 jdk 安装方式(包管理器、手动、sdkman!)
java_home与path的作用与配置方法- 多版本 jdk 的管理与切换策略
- 常见问题的排查思路
- 生产环境的最佳实践
无论你是开发本地应用,还是部署云端服务,正确的 jdk 安装都是坚实的第一步。记住,自动化、版本固定、使用 lts 版本,是保障系统稳定的关键。
最后,别忘了运行你的 helloworld.java,看到那个 🎉 表情时,你就知道——你已经成功踏入了 linux + java 的世界!
🌐 延伸阅读:
到此这篇关于java 部署linux 系统安装jdk与环境变量配置的文章就介绍到这了,更多相关java部署linux安装jdk内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论