同时开发维护的多个项目使用了不同的jdk版本(jdk1.7 jdk1.8 jdk17)编译,如何在编译时把当前的环境变量自动切换到合适的版本,并且不影响其他项目jdk版本呢?在node中有个nvm ,非常容易切换node版本。java中也有类似工具jenv
mac上需要有homebrew,没有的话需要先安装,然后用下面命令安装openjdk,当然你也可以自己到oracle官网下载oracle jdk的dmg包安装。
# 查看本机所有jdk和所在目录
$ /usr/libexec/java_home -V
# 添加历史版本仓库,一个软件有很多版本,brew install时只会安装最新版,我们想安装历史版本就需要这个仓库
$ brew tap homebrew/cask-versions
# 搜索openjdk版本
$ brew search openjdk
# 例如安装openjdk@11
$ brew install openjdk@11
# 安装完成打印的日志,把jdk11目录链接到jdk默认目录
$ sudo ln -sfn /usr/local/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk
安装jenv
$ brew install jenv
# 把安装打印日志中的两行环境变量设置保存到 ~/.zshrc 或 ~/.bash_profile 末尾
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc
使用jenv来管理jdk版本
1. 把本机安装的jdk加入到jenv的版本库中
# 查看本机所有jdk版本和目录
$
# 查看jenv下所有jdk版本
$ jenv versions
# 添加jenv jdk,只需要指定目录,会自动创建版本名称,如果大家都自己指定jdk名称会在项目中产生混乱,你的jdk名称我不认识,我设置的名称你不认识,所以指定名称的方式已经废弃了(jenv jdk8 /jdk/path)
$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home
$ jenv add /usr/local/Cellar/openjdk@11/11.0.15/libexec/openjdk.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/jdk-17.0.3.1.jdk/Contents/Home
# 删除jenv jdk
$ jenv remove 11.0 11.0.15 openjdk64-11.0.15
2. 使用jenv来管理jdk版本,有shell/local/global三种模式
#设置当前shell下jdk版本
$ jenv shell 1.8
#设置本目录下jdk版本,默认生成 .java-version 文件,文件里面写入了jdk版本,适合java项目中使用
$ jenv local 17.0
#设置全局jdk版本
$ jenv global 17.0
设置全局jdk版本不影响当前目录的.java-version中的版本,新开terminal时默认使用global设置的版本
至此,基本玩法实验结束,项目中推荐使用jenv local xxx 设置jdk版本,这样命令行mvn gradle编译代码是自动就是这个版本;如果是服务器,可以使用jenv shell xxx方式来灵活设置编译使用的jdk。
如果你使用的是windows,可能不如mac这么灵活,但也可以随心所欲切换jdk版本,查看这个项目来完成你的设置。