Linux上安装多个JDK版本,需要配置环境变量吗

简短回答:不需要同时配置多个 JDK 的 JAVA_HOMEPATH,但你可以安装多个版本,并通过灵活的方式在它们之间切换。


文章目录

      • ✅ 正确做法:安装多个 JDK,但只让一个生效(通过环境变量或 `alternatives`)
        • 📌 为什么不能同时配置多个?
    • ✅ 推荐方案一:使用 `alternatives` 管理(推荐,适合系统级切换)
      • 1. 安装多个 JDK(示例)
      • 2. 使用 `alternatives` 注册
      • 3. 切换版本
      • ✅ 优点
    • ✅ 推荐方案二:只配置一个 `JAVA_HOME`(适合固定环境)
    • ✅ 推荐方案三:按用户或项目配置(适合开发环境)
    • ✅ 总结:最佳实践
      • 🔁 验证当前使用的是哪个 JDK

✅ 正确做法:安装多个 JDK,但只让一个生效(通过环境变量或 alternatives

📌 为什么不能同时配置多个?
  • JAVA_HOME 是一个环境变量,只能指向一个路径
  • PATH 中的 bin 目录如果包含多个 java,系统只会使用第一个找到的
  • 如果你在 PATH 中同时加入多个 JDK 的 bin,容易导致混乱,难以控制使用的是哪个版本。

✅ 推荐方案一:使用 alternatives 管理(推荐,适合系统级切换)

这是 CentOS/RHEL 系统的标准做法,可以轻松切换默认的 javajavac 等命令。

1. 安装多个 JDK(示例)

假设你已经安装了:

  • JDK 8: /usr/lib/jvm/jdk8u432-b05
  • JDK 11: /usr/lib/jvm/temurin-11-jdk
  • JDK 21: /usr/lib/jvm/temurin-21-jdk

2. 使用 alternatives 注册

# 注册 java 命令
sudo alternatives --install /usr/bin/java java /usr/lib/jvm/jdk8u432-b05/bin/java 1
sudo alternatives --install /usr/bin/java java /usr/lib/jvm/temurin-11-jdk/bin/java 2
sudo alternatives --install /usr/bin/java java /usr/lib/jvm/temurin-21-jdk/bin/java 3# 注册 javac 命令(可选)
sudo alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk8u432-b05/bin/javac 1
sudo alternatives --install /usr/bin/javac javac /usr/lib/jvm/temurin-11-jdk/bin/javac 2
sudo alternatives --install /usr/bin/javac javac /usr/lib/jvm/temurin-21-jdk/bin/javac 3

3. 切换版本

sudo alternatives --config java

会弹出菜单让你选择使用哪个 JDK:

There are 3 programs which provide 'java'.Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jdk8u432-b05/bin/java2           /usr/lib/jvm/temurin-11-jdk/bin/java3           /usr/lib/jvm/temurin-21-jdk/bin/javaEnter to keep the current selection[+], or type selection number: 

输入编号即可切换。

✅ 优点

  • 全局生效,所有用户都使用统一版本。
  • 切换简单,命令清晰。
  • 符合 Linux 系统管理规范。

✅ 推荐方案二:只配置一个 JAVA_HOME(适合固定环境)

如果你确定长期使用某个版本(如 JDK 8),可以只配置一个环境变量。

# /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/jdk8u432-b05
export PATH=$JAVA_HOME/bin:$PATH

其他 JDK 只需解压到 /usr/lib/jvm/ 目录即可,不需要配置环境变量,需要时手动调用:

# 临时使用 JDK 11
/usr/lib/jvm/temurin-11-jdk/bin/java -version# 或临时切换
export JAVA_HOME=/usr/lib/jvm/temurin-11-jdk
$JAVA_HOME/bin/java -version

✅ 推荐方案三:按用户或项目配置(适合开发环境)

不同用户或项目使用不同 JDK:

# 用户家目录下的 .bashrc
# 用户 A 用 JDK 8
export JAVA_HOME=/usr/lib/jvm/jdk8u432-b05# 用户 B 用 JDK 11
export JAVA_HOME=/usr/lib/jvm/temurin-11-jdk

或者在项目脚本中指定:

#!/bin/bash
export JAVA_HOME=/usr/lib/jvm/temurin-11-jdk
./mvnw compile

✅ 总结:最佳实践

方案适用场景是否需要配置多个环境变量
alternatives系统管理员,全局切换❌ 只注册,不同时生效
单一 JAVA_HOME固定使用一个版本❌ 只配置一个
手动调用路径临时使用其他版本❌ 不配置,直接调用
用户级配置多用户不同需求✅ 每个用户可不同
项目级脚本CI/CD、构建脚本✅ 按需设置

🔁 验证当前使用的是哪个 JDK

java -version
echo $JAVA_HOME
which java

结论:

不需要同时配置多个 JDK 的环境变量!

正确做法是:

  1. 安装多个 JDK 到不同目录(如 /usr/lib/jvm/ 下)。
  2. 使用 alternativesJAVA_HOME 切换当前默认版本
  3. 其他版本按需手动调用。

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

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

相关文章

MySQL有哪些高可用方案

大家好,我是锋哥。今天分享关于【MySQL有哪些高可用方案】面试题。希望对大家有帮助; MySQL有哪些高可用方案? 超硬核AI学习资料,现在永久免费了! MySQL 高可用方案是指确保 MySQL 数据库在面对硬件故障、网络故障、负载过重等…

【Windows】Windows平台基于加速地址安装vcpkg并集成到Visual Studio 2017

基础运行环境 启动: 适用于 VS 2017 的 x64 本机工具命令提示 ninja 下载压缩包 https://gh-proxy.com/https:/github.com/ninja-build/ninja/releases/download/v1.13.1/ninja-win.zip 直接解压到c:/Windows (无需配置环境变量) CMake 下载安装包 https://gh-proxy…

LLMs之MCP:Chrome MCP的简介、安装和使用方法、案例应用之详细攻略

LLMs之MCP:Chrome MCP的简介、安装和使用方法、案例应用之详细攻略 目录 Chrome MCP的简介 1、特点 2、与类似项目的比较 Chrome MCP的安装和使用方法 1、安装 2、使用方法 加载 Chrome 扩展 与 MCP 协议客户端一起使用 使用 STDIO 连接(替代方…

【Java EE】多线程-初阶 synchronized 关键字 - 监视器锁 monitor lock

synchronized 关键字 - 监视器锁 monitor lock5. synchronized 关键字 - 监视器锁 monitor lock5.1 synchronized 的特性5.2 synchronized 使⽤⽰例5.3 Java 标准库中的线程安全类本节⽬标• 掌握 synchronized关键字5. synchronized 关键字 - 监视器锁 monitor lock &#xf…

Java多线程:从基础到实战

引言多线程是Java并发编程的核心技术之一,广泛应用于服务器开发、数据处理、实时系统等领域。通过多线程,程序可以充分利用CPU资源,提高执行效率,同时处理多个任务。本文将从多线程的基本概念、实现方式、线程状态、同步与通信到常…

list集合可以一边遍历一遍修改元素吗?

今天看来一下Java中list集合部分的八股,发现了一个以前没注意过的问题,记录一下list可以一边遍历一边修改元素吗?答:在 Java 中,List在遍历过程中是否可以修改元素取决于遍历方式和具体的List实现类。①:对…

Infusing fine-grained visual knowledge to Vision-Language Models

Infusing fine-grained visual knowledge to Vision-Language Models Authors: Nikolaos-Antonios Ypsilantis, Kaifeng Chen, Andr Araujo, Ondřej Chum Deep-Dive Summary: 视觉-语言模型中注入细粒度视觉知识 摘要 大规模对比预训练产生了强大的视觉-语言模型&#xf…

RK3576赋能无人机巡检:多路视频+AI识别引领智能化变革

随着工业巡检任务的复杂度不断提升,无人机逐渐取代传统人工,成为电力、能源、林业、农业等行业的“高空作业主力”。然而,巡检并非简单的拍摄和回放,它要求无人机实时采集多路画面、快速分析异常,并稳定回传数据。这对…

ollama Modelfile 文件生成

输入 根据如下TEMPLATE和params写一个modelfile文件&#xff0c;TEMPLATE为&#xff1a;{{- $lastUserIdx : -1 -}} {{- range $idx, $msg : .Messages -}} {{- if eq $msg.Role “user” }}{{ $lastUserIdx $idx }}{{ end -}} {{- end }} {{- if or .System .Tools }}<|i…

关联规则挖掘2:FP-growth算法(Frequent Pattern Growth,频繁模式增长)

目录 一、核心思想&#xff1a;一个形象的比喻 二、核心思想的具体拆解 步骤一&#xff1a;构建FP-tree&#xff08;频繁模式树&#xff09; 步骤二&#xff1a;从FP-tree中挖掘频繁项集 为什么这很高效&#xff1f; 三、总结 核心思想与优势 适用场景与缺点 四、例题…

在IDEA中DEBUG调试时查看MyBatis-Plus动态生成的SQL语句

在IDEA中DEBUG调试时查看MyBatis-Plus动态生成的SQL语句前言&#xff1a;动态SQL调试的痛与解决方案一、准备工作&#xff1a;调试前的检查清单二、基础方法&#xff1a;SqlSessionTemplate断点调试步骤1&#xff1a;定位SqlSessionTemplate类步骤2&#xff1a;在invoke方法上设…

Linux 文本处理三剑客:awk、grep、sed 完全指南

Linux 文本处理三剑客&#xff1a;awk、grep、sed 完全指南 1. 概述 Linux 系统提供了三个强大的文本处理工具&#xff1a;awk、grep 和 sed&#xff0c;它们各有所长&#xff0c;结合使用可以高效地处理文本数据。 awk&#xff1a;擅长文本分析和格式化输出&#xff0c;是一…

pyecharts可视化图表组合组件_Grid:打造专业数据仪表盘

pyecharts可视化图表组合组件_Grid&#xff1a;打造专业数据仪表盘 目录pyecharts可视化图表组合组件_Grid&#xff1a;打造专业数据仪表盘引言图表1&#xff1a;Grid-Overlap-多X/Y轴示例代码解析1. 图表创建2. 多轴配置3. 图表重叠4. Grid布局效果与应用图表2&#xff1a;Gri…

【电气工程学习】

三极管中&#xff1a;集电极C,基极B&#xff0c;发射极E接线&#xff1a;棕正蓝负黑信号NPN开关输出的是我们的0V,也叫低电平PNP开关输出的是24V,也就是高电平&#xff08;NPN开关导通时&#xff0c;相当于把输出端“拉”到0V&#xff08;低电平&#xff09;&#xff0c;称为“…

【嵌入式】CAN通信

CAN 总线最初由博世于1980年代为汽车行业开发&#xff0c;能够简化复杂的布线网络&#xff0c;还确保可靠和安全的数据传输。 1.CAN技术解释 CAN网络中的每个节点&#xff0c;都是平等的&#xff0c;没有主次之分&#xff0c;这一点和SPI和I2C不同。每个节点都可以在需要的时…

Apache ShenYu网关与Nacos的关联及如何配合使用

Apache ShenYu 网关与 Nacos 之间的关系可以概括为 “协作互补”:Nacos 作为 服务注册与配置中心,为 ShenYu 提供动态的服务发现和配置管理能力,而 ShenYu 作为 流量网关,依赖 Nacos 实现路由信息的动态更新和实时生效。以下是详细解析: 1. 核心关系图解 拉取服务列表/路…

【CPP】一个CPP的Library(libXXXcore)和测试程序XXX_main的Demo

一个CPP的Library和测试程序Demo 1. 思路描述 目录结构 总控CMakeList.txt文件 2. Library代码实现 2.1 XXXLib.hpp文件(对外的接口定义文件)和XXXLib.cpp文件 2.1.1 XXXLib.hpp文件 2.1.2 XXXLib.cpp文件 2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(内部的API基类) 2.2.1 CX…

【YashanDB认证】学习YashanDB的探索之路:从入门到实践

在国产数据库蓬勃发展的浪潮中&#xff0c;选择了YashanDB作为技术学习的切入点。这不仅让我深入了解了数据库的核心技术&#xff0c;也让我深刻体会到国产数据库在性能、可靠性和生态适配上的创新价值。以下是我在学习YashanDB过程中的经验与感悟。 一、YashanDB基础介绍 Ya…

element UI 和 element plus 在组件上有哪些不同

Element UI 和 Element Plus 都是基于 Vue 的桌面端 UI 组件库&#xff0c;由同一团队&#xff08;饿了么前端团队&#xff09;开发和维护。Element Plus 是 Element UI 的升级版&#xff0c;专为 Vue 3 设计&#xff0c;而 Element UI 仅支持 Vue 2。以下是它们在组件层面的主…

【3D重建技术】如何基于遥感图像和DEM等数据进行城市级高精度三维重建?

城市级高精度三维重建是融合多源空间数据&#xff08;遥感图像、DEM、GIS矢量等&#xff09;、计算机视觉与地理信息处理技术的复杂过程&#xff0c;核心目标是构建包含“地形地物&#xff08;建筑、道路、植被等&#xff09;”的真实、高精度三维场景。其流程可分为数据准备、…