美文网首页Java 杂谈Java
Mac上的JDK多版本管理

Mac上的JDK多版本管理

作者: pengisgood | 来源:发表于2019-09-25 11:21 被阅读0次
    jEnv

    我的Mac上已经有一个JDK8的版本了,这不JDK13刚发布(2019-09-17),想快速的尝一尝鲜,就得安装多个版本的JDK了。这个对Node、Ruby、Python的使用者来说,已经不是个什么新鲜话题了,但是对于Java的使用者来说,似乎没有那么多的人受到过多版本的折磨(我是通过GitHub上nvmrbenvpyenvjenv的Star数量臆测出这个结论的 :P)。

    Star

    安装JDK 13

    通过Homebrew 安装JDK 13,可以先通过brew cask info java查看目前Java的版本:

    java: 13,33:5b8a42f3905b406298b72d750b6919f6
    https://openjdk.java.net/
    Not installed
    From: https://github.com/Homebrew/homebrew-cask/blob/master/Casks/java.rb
    ==> Name
    OpenJDK Java Development Kit
    ==> Artifacts
    jdk-13.jdk -> /Library/Java/JavaVirtualMachines/openjdk-13.jdk (Generic Artifact)
    

    这里显示的是JDK13,正好是我想要安装的JDK版本,如果不是你想要的版本可以自己搜索相应的 Homebrew Tap。接下来直接安装:

    $ brew cask install java
    $ java -version
    
    openjdk version "13" 2019-09-17
    OpenJDK Runtime Environment (build 13+33)
    OpenJDK 64-Bit Server VM (build 13+33, mixed mode, sharing)
    

    这就说明JDK13已经安装好了。

    但是另一个问题来了,我电脑上原来安装的JDK8去哪呢?我如何在不同的版本中随意切换呢?比如像Node的nvm,Ruby的rvm,Python的pyenv等。答案是我们可以通过jenv来实现相同的效果。

    安装 jEnv

    1. 安装 jEnv
    $ brew install jenv
    $ 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.2/libexec/libexec:/Users/xxx/.cargo/bin:/Users/xxx/.pyenv/shims:/Users/username/.pyenv:/Users/xxx/.nvm/versions/node/v8.11.4/bin:/Users/xxx/bin:/usr/local/bin:/Users/xxx/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Users/xxx/Documents/Projects/golang/bin
    [ERROR] Jenv is not loaded in your zsh
    [ERROR] To fix :    cat eval "$(jenv init -)" >> /Users/xxx/.zshrc
    

    在这里如果按照提示执行cat eval "$(jenv init -)" >> /Users/xxx/.zshrc:可能会得到如下错误:

    cat eval "$(jenv init -)" >> /Users/xxx/.zshrc
    cat: eval: No such file or directory
    cat: export PATH="/Users/xxx/.jenv/shims:${PATH}"
    export JENV_SHELL=zsh
    export JENV_LOADED=1
    unset JAVA_HOME
    source '/usr/local/Cellar/jenv/0.5.2/libexec/libexec/../completions/jenv.zsh'
    jenv rehash 2>/dev/null
    jenv() {
      typeset command
      command="$1"
      if [ "$#" -gt 0 ]; then
        shift
      fi
    
      case "$command" in
      enable-plugin|rehash|shell|shell-options)
        eval `jenv "sh-$command" "$@"`;;
      *)
        command jenv "$command" "$@";;
      esac
    }: No such file or directory
    

    经过一番搜索,得到如下的解决办法,主要就是将cat替换为echo,这里我已经给jEnv提了个PR,以消除这个干扰。

    • 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.2/libexec/libexec:/Users/xxx/.jenv/shims:/Users/xxx/.cargo/bin:/Users/xxx/.pyenv/shims:/Users/username/.pyenv:/Users/xxx/.cargo/bin:/Users/xxx/.pyenv/shims:/Users/username/.pyenv:/Users/xxx/.nvm/versions/node/v8.11.4/bin:/Users/xxx/bin:/usr/local/bin:/Users/xxx/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Users/xxx/Documents/Projects/golang/bin:/Users/xxx/Documents/Projects/golang/bin
    [OK]    Jenv is correctly loaded
    

    为了能够正确的设置JAVA_HOME,最好开启export插件:

    $ jenv enable-plugin export
    $ exec $SHELL -l
    

    管理不同版本的JDK

    添加JDK

    添加最新安装的JDK:

    $ jenv add $(/usr/libexec/java_home)
    

    如果/usr/libexec/java_home所指的位置不是你想要的,也可以手动指定目录:

    $ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/
    

    查看JDK版本

    执行jenv versions

      system
    * 1.8 (set by JENV_VERSION environment variable)
      1.8.0.191
      13
      openjdk64-13
      oracle64-1.8.0.191
    

    默认情况下,system指的是系统中安装的最新版本的JDK。

    切换JDK版本

    • Global
      设置全局模式下的JDK版本:
    $ jenv global 13
    $ exec $SHELL -l 
    $ java -version
    
    • Local
      在某个工作目录下设置JDK版本,会在当前目录下创建一个.java-version的文件:
    $ jenv local 1.8
    $ exec $SHELL -l 
    $ java -version
    
    • Shell
      设置当前Shell session中的JDK版本:
    $ jenv shell 1.8
    $ java -version
    

    参考链接

    相关文章

      网友评论

        本文标题:Mac上的JDK多版本管理

        本文链接:https://www.haomeiwen.com/subject/zbviuctx.html