随着JDK生成数量的增加和发布节奏的越来越频繁,我发现很难跟踪我在MacOS中安装的内容并即时进行切换,这就需要通过某种方式来进行有效的管理,减轻平时使用过程中的重复劳动。为此需要花上点时间来整理这块的内容来帮助我即时管理与多版本之间的更加丝滑的切换。下面通过三种方式进行管理配置说明:
sh取别名
-
查看已经安装的版本
➜ ~ /usr/libexec/java_home -V Matching Java Virtual Machines (1): 11.0.9, x86_64: "Java SE 11.0.9" /Library/Java/JavaVirtualMachines/jdk-11.0.9.jdk/Contents/Home /Library/Java/JavaVirtualMachines/jdk-11.0.9.jdk/Contents/Home
-
修改配置文件bash(.bash_profile)/zsh(.zshrc),写入如下内容
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_xxx.jdk/Contents/Home export JAVA_9_HOME=/Library/Java/JavaVirtualMachines/jdk-9.0.4jdk/Contents/Home export JAVA_11_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.4.jdk/Contents/Home export JAVA_12_HOME=/Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home alias jdk8="export JAVA_HOME=$JAVA_8_HOME" #编辑一个命令jdk8,输入则转至jdk1.8 alias jdk9="export JAVA_HOME=$JAVA_9_HOME" #编辑一个命令jdk9,输入则转至jdk1.9 alias jdk11="export JAVA_HOME=$JAVA_11_HOME" #编辑一个命令jdk11,输入则转至jdk1.11 alias jdk12="export JAVA_HOME=$JAVA_12_HOME" #编辑一个命令jdk12,输入则转至jdk1.12 export JAVA_HOME=`/usr/libexec/java_home` #最后安装的版本,这样当自动更新时,始终指向最新版本
-
生效配置
# zsh source .zshrc # bash source .bash_profile
-
版本切换
# 切换到Java 9 jdk9 # 切换到Java 8 jdk8
自定义sh脚本
-
定义.java_profile文件
#!/bin/bash java_home=/usr/libexec/java_home function listJDKs() { echo "$($java_home -V 2>&1)" } function listJDKVendors() { echo "$($java_home -V 2>&1 | tr ' ' '\0' | tr '\t' ' ' | cut -d ' ' -f2,1)" } function setJDK() { local USAGE="Usage: setJDK [-v \${JDK_VERSION}] [-d \${JDK_DISTRIBUTION}]" local OPTIND v d while getopts "v:d:" OPTION; do case "$OPTION" in v) local version=$OPTARG ;; d) local dist=$OPTARG ;; ?) echo $USAGE return 1 ;; esac done if [ $# -lt 1 ]; then echo $USAGE return 1 fi if [ -n "$version" ] && [ "$dist" ]; then echo "Setting JAVA to version $version and distribution $dist" local versionAndDistNo=$($java_home -V 2>&1 | grep $dist | grep $version | wc -l) if [ "$versionAndDistNo" -gt 1 ];then echo "Multiple JAVA versions found for arguments -v $version -d $dist . Unable to setJDK" listJDKs return 1 else export JAVA_HOME=$($java_home -V 2>&1 | grep $dist | grep $version | tr ' ' '\0' | tr '\t' ' ' | cut -d ' ' -f 3) fi elif [ -n "$dist" ]; then echo "Setting JAVA to distribution $dist" local distNo=$($java_home -V 2>&1 | grep $dist | wc -l) if [ $distNo -gt 1 ];then echo "Multiple versions for $dist. Unable to setJDK" listJDKs return 1 else export JAVA_HOME=$($java_home -V 2>&1 | grep $dist | tr ' ' '\0' | tr '\t' ' ' | cut -d ' ' -f 3) fi elif [ -n "$version" ]; then echo "Setting JAVA to version $version" export JAVA_HOME=$($java_home -v $version) else echo $USAGE fi echo "JAVA_HOME=${JAVA_HOME}" return 0 }
-
修改配置文件bash(.bash_profile)/zsh(.zshrc),写入如下内容
source .java_profile setJDK -v 11 -d JavaSE11.0.9 export PATH=$PATH:$JAVA_HOME
-
生效配置
# zsh source .zshrc # bash source .bash_profile
-
切换版本
setJDK -v 11
参考
https://dev.to/nikos_katsanos/managing-jdks-in-macos-27p9
https://github.com/nikkatsa/nikkatsa-devops/blob/master/dotfiles/.java_profile
开源管理工具
使用 brew 安装 JDK 也非常简单
# search 命令看看有哪些 JDK 版本可供安装
brew search java
# info 命令查看目前Java的版本
brew info java
# install 命令安装最新的Java版本
brew install java
jEvn
-
使用brew安装jEnv
brew install 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:/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/xue.zeng/.zshrc
-
修改配置,命令行执行如下内容
# bash echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(jenv init -)"' >> ~/.bash_profile exec $SHELL -l # zsh echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(jenv init -)"' >> ~/.zshrc exec $SHELL -l
-
再次检查是否安装成功
➜ ~ 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/xue.zeng/.jenv/shims:/Users/xue.zeng/.jenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin [OK] Jenv is correctly loaded
-
为了能够正确的设置
JAVA_HOME
,最好开启export
插件➜ ~ jenv enable-plugin export You may restart your session to activate jenv export plugin echo export plugin activated ➜ ~ exec $SHELL -l
-
添加
JDK
$ jenv add $(/usr/libexec/java_home)
如果
/usr/libexec/java_home
所指的位置不是你想要的,也可以手动指定目# 列出已经安装的 JDK 路径 ➜ ~ /usr/libexec/java_home -V Matching Java Virtual Machines (1): 11.0.9, x86_64: "Java SE 11.0.9" /Library/Java/JavaVirtualMachines/jdk-11.0.9.jdk/Contents/Home # jenv add 命令挨个将上述路径添加即可 ➜ ~ jenv add /Library/Java/JavaVirtualMachines/jdk-11.0.9.jdk/Contents/Home/ oracle64-11.0.9 added 11.0.9 added 11.0 added 11 added
-
查看
JDK
版本➜ ~ jenv versions * system (set by /Users/xue.zeng/.jenv/version) 11 11.0 11.0.9 oracle64-11.0.9
-
切换
JDK
版本jEnv 的精髓是 shell、local 和 global 三个参数命令
-
shell 用于设置终端窗口生命周期内使用的 JDK 版本;
shell 命令设置的 JDK 是终端窗口生命周期内有效的,即你一旦退出终端再次进入则会失效
$ jenv global 1.8 $ exec $SHELL -l $ java -version
-
local 用于设置当前目录下使用的 JDK 版本;
在当前工作目录下设置JDK版本,会在当前目录下创建一个
.java-version
的文件$ jenv local 1.8 $ exec $SHELL -l $ java -version
-
global 用于设置全局使用的 JDK 版本
$ jenv global 11 $ exec $SHELL -l $ java -version
-