关注Java领域相关技术 记录有趣的事情

MacOS 多版本JDK管理

US-B.Ralph
US-B.Ralph
2020-11-10

前言

很多时候我们都需要安装多个版本JDK,比如不同项目使用的JDK版本不同;再比如JDK发布新版本,我们肯定要第一时间跟进熟悉。
那么MacOS中如何更方便的管理这些JDK呢?

JDK安装

  • 可以选择官网下载pkg进行安装:
  • 使用包管理工具brew进行安装
    • 安装历史版本需要首先安装brew的扩展包 homebrew-cask-versions,命令 brew tap homebrew/cask-versions
    • 使用命令 brew search java 查看可安装版本
    • 使用命令 brew cask install java 安装最新版本的JDK
    • 使用命令 brew cask install java8 安装相应版本的JDK

MacOS中多版本JDK管理

首先查看当前已安装JDK版本及其安装路径 /usr/libexec/java_home -V

us-b.fun@us-bfundeMini ~ % /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    15.0.1, x86_64: "Java SE 15.0.1"    /Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home
    1.8.0_271, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home

得到不同版本JDK的安装路径后我们就可以继续下一步。

使用 export 命令

通过 export 命令来更换 JAVA_HOME 的设置,可以实现切换不同版本JDK的目的,命令如下:

us-b.fun@us-bfundeMini ~ % export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home

shell 配置文件中使用 export & alias

直接使用 export 命令虽然可以达到切换不同版本的JDK的目的但是每次输入一大串很繁琐。

我们可以在shell配置文件文件 $HOME/.profile 中使用 export 和 alias 配置管理不同版本的的 JDK ,配置如下:

export JAVA_8_HOME=(/usr/libexec/java_home -v 1.8.0.271)
export JAVA_15_HOME=(/usr/libexec/java_home -v 15.0.1)

export JAVA_HOME=JAVA_8_HOME

alias jdk8="export JAVA_HOME=JAVA_8_HOME"
alias jdk15="export JAVA_HOME=$JAVA_15_HOME"

完成以上配置后,使用 source 命令使配置生效 source ~/.profile

现在可以使用别名在不同JDK之间快速切换了,效果如下:

us-b.fun@us-bfundeMini ~ % jdk8
us-b.fun@us-bfundeMini ~ % java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
us-b.fun@us-bfundeMini ~ % jdk15        
us-b.fun@us-bfundeMini ~ % java -version
java version "15.0.1" 2020-10-20
Java(TM) SE Runtime Environment (build 15.0.1+9-18)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)

使用 jEnv 管理JDK

配置文件中使用export & alias 虽然可以实现不同版本JDK的切换,但是不够精细,其作用范围是全局的。
这里发现一个小工具 jEnv 推荐给大家。关于jEnv 的介绍\安装步骤\使用请跳转官网查看。

在这里仅列出一些常用命令:

us-b.fun@us-bfundeMini ~ % jenv help
jenv 0.5.4
Usage: jenv  []

Some useful jenv commands are:
   commands    List all available jenv commands
   local       Set or show the local application-specific Java version
   global      Set or show the global Java version
   shell       Set or show the shell-specific Java version
   rehash      Rehash jenv shims (run this after installing executables)
   version     Show the current Java version and its origin
   versions    List all Java versions available to jenv
   which       Display the full path to an executable
   whence      List all Java versions that contain the given executable
   add         Add JDK into jenv. A alias name will be generated by parsing "java -version"

使用 jenv add jdk_path 即可将 JDK 注册到 jenv 中

使用 jEnv 配置JDK过程中可能遇到的问题

  • 直接向jEnv添加JDK时报错,信息如下:
us-b.fun@us-bfundeMini ~ % jenv add /System/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home
/System/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home is not a valid path to java installation
  • 使用 jenv doctor 排查,提示如下:
us-b.fun@us-bfundeMini ~ % jenv doctor
[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.
[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:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
[ERROR] Jenv is not loaded in your zsh
[ERROR] To fix :    echo eval "$(jenv init -)" >> /Users/us-b.fun/.zshrc
- 根据提示我们知道,该问题是因为 jEnv 未初始化造成的。
  • 初始化 jEnv
    • 在 shell 配置文件中增加 jenv init,并使配置文件生效:
us-b.fun@us-bfundeMini ~ % echo eval "(jenv init -)" >>HOME/.profile
us-b.fun@us-bfundeMini ~ % source .profile 
jenv has been updated, process to refresh plugin links
us-b.fun@us-bfundeMini ~ % 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/us-b.fun/.jenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
[OK]    Jenv is correctly loaded
  • 此时再次向jEnv中添加JDK,提示如下:
us-b.fun@us-bfundeMini ~ % jenv add /System/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home
/System/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home is not a valid path to java installation
  • 经过一番探索,在 gitbub 中找到了答案,点此跳转,其处理过程如下:
us-b.fun@us-bfundeMini local % export JENV_ROOT=/usr/local/opt/jenv
us-b.fun@us-bfundeMini local % sudo jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home
oracle64-1.8.0.271 added 
 1.8.0.271 added
 1.8 added
us-b.fun@us-bfundeMini local % sudo jenv add /Library/Java/JavaVirtualMachines/jdk- 15.0.1.jdk/Contents/Home  
 oracle64-15.0.1 added
 15.0.1 added
 15.0 added
 15 added
  • 使用 jenv versions 验证
 us-b.fun@us-bfundeMini local % sudo jenv versions
 Password:
 * system (set by /Users/us-b.fun/.jenv/version)
  1.8
  1.8.0.271
  15
  15.0
  15.0.1
  oracle64-1.8.0.271
  oracle64-15.0.1

使用

  • 设置默认 JDK
jenv global  oracle64-15.0.1
  • 为某个项目单独配置 JDK
cd 
jenv local  oracle64-1.8.0.271
- 该命令的作用是在 project 目录下创建 .java-version 文件,文件内容是 JDK 版本。
US-B.Ralph
工具

One Comment

  • erotik

    Hello there. I found your web site by way of Google at the same time as looking for a related topic, your website came up. It seems to be great. I have bookmarked it in my google bookmarks to come back then. Pru Iver Lathan

Leave a Comment

邮箱地址不会被公开。 必填项已用*标注

12 − 11 =