jenv => Java Environment
Use jenv set up multiple Java Environment.
快速上手
Bye AdoptOpenJDK, Hello Adoptium!
- Open JDK
当下 Java 开发是由 Oracle 主导,以 OpenJDK 开源项目的形式进行。Oracle 和社区提供的 OpenJDK 分别称为 Oracle's OpenJDK 和 AdoptOpenJDK。
OracleJDK 只提供 6 个月的安全更新服务给 Oracle’s OpenJDK,AdoptOpenJDK 则对 OpenJDK 提供四年的长期支持版本 LTS。
- Temurin
Homebrew's AdoptOpenJDK 最高只到 16,后续的开发已从 AdoptOpenJDK 迁移到 Eclipse Adoptium。Eclipse 基金会的 Adoptium 提供 Java 生态系统和运行时的相关技术,其子项目 Eclipse Temurin 是基于 OpenJDK 的开源 JavaSE 构建。
破旧立新
- 卸载 AdoptOpenJDK
终端查看安装的 JDK 版本,并以管理员身份进行卸载,随后将 ~/.zshrc 中的相关配置注释。
以 Homebrew 卸载时要将 untap 操作置于最后执行,否则会出现 Error: Refusing to untap adoptopenjdk/openjdk because it contains the installed formulae...
若不是通过 Homebrew 安装的 JDK,则会出现提示 Error: Cask 'adoptopenjdk16' is not installed. => 只要将 Homebrew 安装的卸载干净即可 untap。
# 方式一 =>
$ ls /Library/Java/JavaVirtualMachines/ # 普遍 Java 安装存放位置
jdk-11.0.11.jdk
$ sudo rm -rf /Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk
# 方式二 =>
$ brew remove --cask adoptopenjdk8 # 卸载 adoptopenjdk
$ brew untap AdoptOpenJDK/openjdk # untap => 避免 Error: Cask xxx exists in multiple taps
- 安装 Temurin
$ brew tap homebrew/cask-versions # tap 能扩大 casks 范围
$ brew install -- cask temurin8 # 位置 => /Library/Java/JavaVirtualMachines/
- 安装 jenv => 可能将存在的 iterm2 配置损坏
根据 jenv doctor
输出结果可观察到 jenv 已正确加载但尚未安装 Java
$ mkdir ~/.jenv # Create Dir => 官方指导没有这一步
$ brew install jenv
$ jenv doctor # To verify jenv was installed => 下方代码是正确情况
[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 : /.../.../:/.../.../:/.../.../:/.../.../:/.../.../:/.../.../...
[OK] Jenv is correctly loaded
若出现如下情况则表示存在配置名占用 => 需要卸载 jdk
[ERROR] JAVA_HOME variable already set, scripts that use it directly could not use java version set by jenv [ERROR] Java binary in path is not in the jenv shims.
确保 JAVA_HOME 已设置,应确保启用 export 插件(根据情况可忽略这一步)
$ jenv enable-plugin export
$ exec $SHELL -l
- 添加 Java 环境
默认情况下,当前环境最新版本的 Java 是 system 在 macOS 上的默认版本。通过 jenv local VERSION 可以为当前工作目录设置一个本地 Java 版本。同时会伴生创建一个 .java-version 文件,目的是为项目检入 Git,且启动 shell 时让 jenv 确保加载此 java。
# 注意通过 brew 安装的 jdk 存在于 /usr/local/Cellar/... => 已过时
$ jenv add /usr/local/Cellar/openjdk@11/11.0.12
11.0.12 added
11.0 added
11 added
$ brew install openjdk@8
$ jenv add /usr/local/Cellar/openjdk@8/1.8.0+302
...
# 2022/03/03 更新 => /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home
# Home 结束 => 否则会出现 $PATH is not a valid path to java installation 的 Error
$ jenv add /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home
openjdk64-11.0.12 added
temurin64-1.8.0.332 added
1.8.0.332 added
1.8 added
1.8.0.332 already present, skip installation
$ jenv doctor # 检查 jenv 显示正确
[OK] JAVA_HOME variable probably set by jenv PROMPT
[OK] Java binaries in path are jenv shims
[OK] Jenv is correctly loaded
$ brew install -- cask temurin11
$ jenv add /Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home
$ brew install -- cask temurin17
$ jenv add /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
- 开发版本配置
配置方面除开版本名外并无明显操作区别,本段过程以旧版本 openjdk 为主。
$ jenv versions # View Java environment version list
* system (set by /Users/zsxzy/.jenv/version) # 旧版本 => 废弃
1.8
1.8.0.302
11
11.0
11.0.12
openjdk64-1.8.0.302
openjdk64-11.0.12
$ jenv local 1.8.0.302 # Java environment selection
$ exec $SHELL -l # Java environment selection
$ cat .java-version # Java environment selection
1.8.0.302
$ echo ${JAVA_HOME} # Check if it is set
/Users/zsxzy/.jenv/versions/1.8.0.302
$ jenv global 1.8.0.302 # Global Java version settings
$ java -version
openjdk version "1.8.0_302"
OpenJDK Runtime Environment (build 1.8.0_302-bre_2021_08_14_21_34-b00)
OpenJDK 64-Bit Server VM (build 25.302-b00, mixed mode)
# Shell Java version setting
$ jenv shell 11 # 当前 shell 会话使用指定设置的 Java
$ jenv which java # 显示可执行的 Java 的完整路径
$ rm .java-version # Delete .java -version which u don't need
在设置完 Java 版本后,可通过 Java8 的 java -version 或 Java 9+ 的 java --version 查看版本。
补漏订讹
AdoptOpenJDK 与 tap
Homebrew 默认只有两个仓库 Formulae 与 Casks,可以使用 tap 指令添加更多仓库,search 到更多的内容。OpenJDK releases 需要在 tap 中查看,意味着是从 brew casks 中分离的部分。通过 brew tap add 指定仓库进行添加。
$ brew tap AdoptOpenJDK/openjdk
$ brew search /adoptopenjdk/
# 安装需要的 jdk 版本
$ brew install adoptopenjdk11
$ brew install adoptopenjdk8
# 注册 jenv
$ jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-11|8.jdk/Contents/Home
# 全局设置 JDK
$ jenv global 11
# 或者对于项目目录中的特定项目
$ cd ~/projects/my_project
$ jenv local 1.8
$ java -version
openjdk version "1.8.0_202"
# 取消版本设置
$ jenv global system
$ cd ~/projects/my_project
$ jenv local --unset
结束
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议,转载请注明出处!