如何在MacOS中管理多个Java版本
2024-10-17
922 字约 4 分钟
...在这篇指南中,我们将完成使用jEnv命令行工具来管理MacOS系统中的三个JDK版本(Java8、Java11和Java17),大致流程为:
- 使用MacOS的包管理工具Homebrew安装JDK环境变量管理工具jEnv
- 使用Homebrewan安装多个JDK版本
- 将多个Java版本的路径加入jEnv
- 通过jEnv命令设置全局、项目和shell的Java版本
所有涉及的工具清单如下:
- Homebrew,Homebrew是一个免费的MacOS包管理工具,我们用它来安装JDK和JDK版本管理工具
- jEnv,jEnv是一个让你不需要记住如何设置JAVA_HOME环境变量的命令行工具,我们将用它来管理系统中的JDK版本
安装步骤
安装Homebrew
在MacOS上安装Homebrew,可以参考MacOS包管理工具-Homebrew
安装jEnv
输出:
Running `brew update --preinstall`...
==> Downloading https://ghcr.io/v2/homebrew/core/jenv/manifests/0.5.4
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/jenv/blobs/sha256:521a1ad6e28b90f1e37893d279950e35957a0580464d639ec74c3
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:521a1ad6e28b90f1e37893d279950e35957
######################################################################## 100.0%
==> Pouring jenv--0.5.4.all.bottle.tar.gz
==> Caveats
To activate jenv, add the following to your ~/.zshrc:
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
==> Summary
🍺 /usr/local/Cellar/jenv/0.5.4: 84 files, 73KB
==> Running `brew cleanup jenv`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
按照输出提示,我们需要将以下配置加入我们的shell配置文件中(如果系统使用的shell是bash,就将其加入~/.bash_profile或者~/.bashrc;如果使用的shell是zsh,就将其加入~/.zshrc文件中)。
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
我们可以直接将上述配置直接粘贴到shell配置文件中,也可以通过echo将其加入配置文件中:
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
不管通过哪种方式完成配置后,我们需要使配置立即生效:
jEnv已经安装配置完成,我们可以通过jenv doctor命令验证一下:
输出:
[OK] No JAVA_HOME set
[ERROR] Java binary in path is not in the jenv shims.
[ERROR] Please check your path, or try using /path/to/java/home is not a valid path to java installation.
PATH : /usr/local/Cellar/jenv/0.5.4/libexec/libexec:/Users/username/.nvm/versions/node/v17.3.0/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands
[ERROR] Jenv is not loaded in your zsh
[ERROR] To fix : echo eval "$(jenv init -)" >> /Users/username/.zshrc
假如看到类似上面错误提示,暂且不用理会,因为我们还没将JDK添加到jEvn的管理中。如果我们在后续会使用到Maven还需要以下操作:
- 启用export插件
jenv enable-plugin export
输出
You may restart your session to activate jenv export plugin echo export plugin activated
- 启用Maven插件
输出
安装Java
# 安装最新版OpenJDK
$ brew install --cask temurin
# 安装其他版本
$ brew tap homebrew/cask-versions
$ brew install --cask temurin11
$ brew install --cask temurin8
配置jEnv
把所有JDK加入jEnv管理
首先,查看系统中有哪些JDK版本:
/usr/libexec/java_home -V
输出:
Matching Java Virtual Machines (4):
17.0.2 (x86_64) "Eclipse Temurin" - "Eclipse Temurin 17" /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
11.0.13 (x86_64) "Oracle Corporation" - "Java SE 11.0.13" /Library/Java/JavaVirtualMachines/jdk-11.0.13.jdk/Contents/Home
1.8.202.08 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
1.8.0_202 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
然后,将所有JDK的路径加入到jEnv中,语法如下:
例如:
jenv add /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
查看下jEnv管理的所有JDK版本:
输出:
system
1.8
1.8.0.202
* 11 (set by /Users/username/.jenv/version)
11.0
11.0.13
17
17.0
17.0.2
openjdk64-17.0.2
oracle64-1.8.0.202
oracle64-11.0.13
设置全局JDK版本
设置项目JDK版本
如果要为项目指定JDK版本,只需在项目根目录下使用以下命令即可,jEnv会在目录下生成.java-version文件来描述当前项目使用的JDK版本
设置shell的JDK版本
FAQ
jEnv启用插件报错
问题信息
jenv: no such command `enable-plugin'
解决方案
重启会话终端
参考资料
如果您觉得这篇文章有帮助,请点个赞吧~
相关文章
更多文章 →flutter2026-07-01
Dart 入门回顾
1\. Dart 是什么 Dart 是一门类型安全、支持面向对象、支持异步编程的语言。它的语法和 JavaScript、TypeScript、Java、C# 都有一些相似之处。 Dart 常见使用场景: Flutter 跨平台应用开发 命令行工具 Web 应用 服务端接口或脚本 作为学习现代类型语言的入口 Dart 的几个核心特点: 静态类型:变量、函数返回值、参数都有类型。 类型推断:很多时候可以用 ,让 Dart 自动推断类型。 空...
学习
flutter2026-07-01
Flutter 常用 Widget 入门
Flutter 的核心思想是:一切皆 Widget。文字、图片、按钮、页面结构、布局、间距、滚动、动画、手势,几乎都由 Widget 组合出来。 1\. Widget 先分成几类理解 | 类别 | 常用 Widget | 解决什么问题 | | | | | | 应用入口 | 、 | 搭建应用外壳、主题、路由 | | 页面骨架 | 、 、 | 标准页面结构 | | 基础显示 | 、 、 | 显示文字、图标、图片 | | 布局容器 | 、 、...
学习
flutter2024-11-21
在 Flutter 中使用 webview_flutter 4.0
1. 2. ,已入选 3. 4. 本文是第 4 篇,定位是新手入门,介绍和演示 webview 的基础用法。最后还介绍了事件处理的技巧。因为是补写的,所以本来应该首发的却发在最后了。 环境准备已经在 说过了,不再赘述。既然是新手入门,就会本着详尽的原则,而且会多配示例。 获取页面信息 获取页面 title 核心方法:controller.getTitle 完整示例,放在 main.dart 就能运行。运行示例,点击获取 title 的按...
学习
flutter2024-11-06
flutter android端运行报错Namespace not specified. Specify a namespace in the module‘s build file
在使用flutterSDK 3.24之后发现新建项目,项目默认都是基于AGP8了,由于 AGP 开始强制要求 namespace 配置,不仅仅是主工程,也包括第三方库都强制要求 namespace 。但是我们在引入第三方库的时候会发现部分库没能及时的去做相关配置,这也就导致了我们会出现标题错误: 出现这个问题,我们可能会通过去找到本地缓存的第三方库代码去修改它的build.gradle和AndroidManifest.xml来解决缺失...
学习
flutter2024-11-03
Flutter中如何实现APP升级功能背景
背景 每个App应用中一定会包含的功能 ,App的运行平台不同实现升级功能的方式也就不同,基本分类如下所示。本文主要聚焦在使用Flutter框架开发的应用在安卓系统内如何更新,以及所涉及要点梳理。 IOS系统 Andriod系统 官网下载 各类应用市场 (本文聚焦点) 功能清单(按步骤) UpgradeCard组件(展示升级内容) 进行新旧版本对比判断是否需要更新 下载更新然后安装应用 UpgradeCard组件 组件需要包含基本标题、...
学习
flutter2024-11-03
Flutter应用内更新App版本使用flutter_downloader而非ota_update
做当前App应用内更新的前提:用户可以在App更新的时候还可以使用软件,不能让他一直等待下载,关闭下载组件后,打开组件还能继续看到他的进度,并且用户锁屏或者短暂退出APP后需要保证任务不能总是挂掉,这里没有用到保活,而是需要用到生命周期去让他暂停和恢复,所以当前app还要有一个全局管理类保存任务id。UI图在最后 (插件文档说明可以通知栏显示,但是我用的这个版本在100%下完后总是failed,而不是complete,就不会很友好,后面...
学习
评论
请登录后发表评论
去登录