JDK管理-MacOS

随着JDK生成数量的增加和发布节奏的越来越频繁,我发现很难跟踪我在MacOS中安装的内容并即时进行切换,这就需要通过某种方式来进行有效的管理,减轻平时使用过程中的重复劳动。为此需要花上点时间来整理这块的内容来帮助我即时管理与多版本之间的更加丝滑的切换。下面通过三种方式进行管理配置说明:

  • sh取别名
  • 自定义sh脚本
  • 开源管理工具(jEvnjabbaSDKMAN

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 三个参数命令

    1. shell 用于设置终端窗口生命周期内使用的 JDK 版本;

      shell 命令设置的 JDK 是终端窗口生命周期内有效的,即你一旦退出终端再次进入则会失效

      $ jenv global 1.8
      $ exec $SHELL -l 
      $ java -version
      
    2. local 用于设置当前目录下使用的 JDK 版本;

      在当前工作目录下设置JDK版本,会在当前目录下创建一个.java-version的文件

      $ jenv local 1.8
      $ exec $SHELL -l 
      $ java -version
      
    3. global 用于设置全局使用的 JDK 版本

      $ jenv global 11
      $ exec $SHELL -l 
      $ java -version
      
Setting  JDK 

See also