Mac 环境下 JDK 版本切换全指南

news2025/5/17 2:42:34

概要

在 macOS 上安装了多个 JDK 后,可以通过系统自带的 /usr/libexec/java_home 工具来查询并切换不同版本的 Java。只需在终端中执行 /usr/libexec/java_home -V 列出所有已安装的 JDK,然后将你想使用的版本路径赋值给环境变量 JAVA_HOME,并将其添加到 PATH。最后,将这些设置写入你的 shell 启动文件(如 ~/.zshrc~/.bash_profile),即可在每次新开终端时自动生效。


一、查询已安装的 JDK 版本

  1. 打开 终端,输入:

    /usr/libexec/java_home -V
    

    该命令会输出所有已安装的 Java 虚拟机列表及其安装路径,例如:

    Matching Java Virtual Machines (3):
        17.0.2 (x86_64) "Oracle Corporation" - "Java SE 17.0.2" /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home  
        1.8.0_202 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home  
    

    上面是一个示例,像我的电脑上装的jdk就有点乱了
    在这里插入图片描述


二、临时切换 JDK 版本

如果仅想在当前终端会话中切换版本,可直接运行:

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)  
export PATH="$JAVA_HOME/bin:$PATH"
  • -v 1.8 可替换为你需要的版本号(如 -v 17-v 11.0.2 等)([Stack Overflow][2])
  • 切换后,执行 java -version 即可验证当前使用的 Java 版本

三、永久切换 JDK 版本

为了在每次打开终端时都自动使用同一版本,需要将上述环境变量配置写入 shell 启动文件。

1. 确定使用的 Shell

  • macOS 默认从 macOS Catalina 起采用 Zsh,启动文件为 ~/.zshrc
  • 如果你使用的是 Bash,则应编辑 ~/.bash_profile~/.bashrc

2. 编辑启动文件

以 Zsh 为例,打开或创建 ~/.zshrc

vim ~/.zshrc

或者

nano ~/.zshrc

在文件末尾添加:

# 指向 Java 17(示例)像我的电脑上jdk装的有点乱了,可以指定特定的版本比如17.0.15
export JAVA_HOME=$(/usr/libexec/java_home -v 17.0.15)  
export PATH="$JAVA_HOME/bin:$PATH"

保存并退出(Ctrl+XYEnter/获取:wq保存(vim的操作))

3. 使配置生效

source ~/.zshrc
java -version

在这里插入图片描述

此时终端应显示你指定的 Java 版本信息。


四、使用别名或脚本快速切换(可选)

如果经常在不同项目间切换 JDK,可以在启动文件中定义别名或函数,例如:

# ~/.zshrc 中
alias java8='export JAVA_HOME=$(/usr/libexec/java_home -v 1.8); export PATH="$JAVA_HOME/bin:$PATH"; java -version'
alias java17='export JAVA_HOME=$(/usr/libexec/java_home -v 17); export PATH="$JAVA_HOME/bin:$PATH"; java -version'

这样在终端中仅需执行 java8java17 即可快速切换版本。


五、可以尝试:使用 SDKMAN!

sdkman能让你在 Unix 系统上轻松管理多个软件开发工具包,像 apt、pip、RVM 和 rbenv一样工具
也可以理解为node的版本管理的工具nvm一样的工具软件
SDKMAN! 是一个管理多种 SDK(包括 Java)版本的工具。安装后可用一条命令列出并切换 JDK:

sdk list java
sdk use java 17.0.2-tem

这种方式在管理众多 Java 发行版(Oracle、Temurin、Amazon Corretto 等)时尤为方便。


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

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

相关文章

Pillow 移除或更改了 FreeTypeFont.getsize() 方法

w, h self.font.getsize(label) # text width, height AttributeError: FreeTypeFont object has no attribute getsize 在Pillow 项目的变更日志里可以查到哪个版本移除了 getsize() 方法,Pillow仓库: Releases python-pillow/Pillow GitHub 因为…

视频编辑软件无限音频、视频、图文轨

威力导演APP的特色功能包括无限音频、视频、图文轨,以及上百种二/三维特技转场、音/视频滤镜和多种音视频混编输出。此外,它还支持实时高清HDV格式、模拟信号输出,并具有DV25、DVACM、DV、HDV输入和输出等功能。在视频编辑领域,威…

uniapp-商城-53-后台 商家信息(更新修改和深浅copy)

1、概述 文章主要讨论了在数据库管理中如何处理用户上传和修改商家信息的问题,特别是通过深浅拷贝技术来确保数据更新的准确性和安全性。 首先,解释了深拷贝和浅拷贝的区别:浅拷贝使得两个变量共享相同的内存地址,而深拷贝则创建新…

[Java实战]Spring Boot 整合 Thymeleaf (十)

[Java实战]Spring Boot 整合 Thymeleaf (十) 引言 在 Java Web 开发领域,Thymeleaf 以其自然模板、无缝 Spring 集成和强大的表达式引擎脱颖而出,成为 Spring Boot 官方推荐的模板引擎。本文将深度解析 Spring Boot 与 Thymelea…

监控易一体化运维:网络流量分析的智慧引擎

在数字化时代,企业运营与网络紧密相连,网络性能的优劣直接影响企业的发展步伐。网络流量管理在企业网络运维中占据非常关键的地位。监控易一体化运维管理软件,凭借其强大的网络流量分析功能,为企业网络的稳定高效运行提供了有力保…

IDEA+git将分支合并到主分支、IDEA合并分支

文章目录 一、合并分支二、可能遇到的问题2.1、代码冲突 开发过程中我们可能在开发分支(dev)中进行开发,等上线后将代码合并到主分支(master)中,本文讲解如何在IDEA中将dev分支的代码合并到master分支中。 一、合并分支 功能说明:将dev分支的…

uniapp+vue3中自动导入ref等依赖

前言: 在我们使用uni-appvue3创建项目,开发的过程中,老是需要导入我们的ref、onshow等,那么能不能自动导入,不用我们每个页面都写呢?是没问题的,这里让他的小帮手来帮你减轻负担:他就…

【.net core】.net core 6.0添加WCF服务引用

在 .NET Core 6.0 (.NET 6) 中,调用 WCF 服务 是完全支持的,只要服务使用的是 basicHttpBinding 或类似 HTTP 协议的绑定(如 wsHttpBinding,但不推荐) .NET Core不支持 net.tcp,只能用http形式。 .net core调用WCF服务…

小结: js 在浏览器执行原理

浏览器多进程与多线程 现代浏览器的标签环境隔离主要通过多进程架构和多线程机制实现,以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析: ------------------- ------------------- -----------…

【实战篇】低代码报表开发——平台运营日报表的开发实录

前言 myBuilder的推广有段时间了,想开发个报表看看平台运营的情况。采用myBuilder强大的报表、数据交换模块功能,直接开干。 1. 报表指标思考与概要设计 首先是报表模块的概要设计,先构思一下,我希望报表能查看新用户注册、活跃…

使用Qt操作SQLite数据库

目录 一、开发成果二、环境配置与基础概念1. 引入SQL模块2. SQLite数据库特性三、数据库连接与操作流程1. 创建并连接数据库2. 执行SQL语句3. 查询与遍历数据四、进阶操作与最佳实践1. 事务处理2. 错误处理3. 使用模型/视图架构五、完整代码示例(学生人员管理)1.mainwindow.h…

ZYNQ笔记(二十):Clocking Wizard 动态配置

版本:Vivado2020.2(Vitis) 任务:ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…

探秘高可用负载均衡集群:企业网络架构的稳固基石

目录 高可用负载均衡集群 一、集群的本质与核心价值​ 二、高可用集群与负载均衡集群的定义​ 高可用集群(HA Cluster)​ 负载均衡集群(Load Balance Cluster)​ 三.高可用与负载均衡的完美融合 四.…

JAVA:ResponseBodyEmitter 实现异步流式推送的技术指南

1、简述 在许多场景下,我们希望后端能够以流式、实时的方式推送数据给前端,比如消息通知、日志实时展示、进度条更新等。Spring Boot 提供了 ResponseBodyEmitter 机制,可以让我们在 Controller 中异步地推送数据,从而实现实时流式输出。 样例代码:https://gitee.com/lh…

CSS- 1.1 css选择器

本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 系…

ABP-Book Store Application中文讲解 - Part 2: The Book List Page

本章用于介绍如何创建Book List Page。 TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 1: Creating the Server Side 项目之间的引用关系。 目录 1. 多语言配置 1.1 zh-Hans.json 1.2 en.jso…

08 web 自动化之 PO 设计模式详解

文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构?1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…

langchain4j集成QWen、Redis聊天记忆持久化

langchain4j实现聊天记忆默认是基于进程内存的方式,InMemoryChatMemoryStore是具体的实现了,是将聊天记录到一个map中,如果用户大的话,会造成内存溢出以及数据安全问题。位了解决这个问题 langchain4提供了ChatMemoryStore接口&am…

WebGL图形编程实战【7】:变换流水线 × 坐标系与矩阵精讲

变换流水线 #mermaid-svg-Omabd9LSNCdIvWqB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Omabd9LSNCdIvWqB .error-icon{fill:#552222;}#mermaid-svg-Omabd9LSNCdIvWqB .error-text{fill:#552222;stroke:#552222;…

DVWA靶场通关笔记-SQL注入(SQL Injection Medium级别)

目录 一、SQL Injection 二、代码审计(Medium级别) 1、源码分析 (1)index.php (2)Medium.php 2、渗透思路 (1)SQL安全问题分析 (2)SQL渗透思路 三、…