一机多Java版本粗粒度管理。同时,在学习新的JDK特性时,往往需要安装最新版本的JDK。针对这些情况,我们需要在本地环境安装多个JDK,方便切换。本文以MacOS操作系统为例,演示如何安装多个JDK版本并进行切换。这里重点介绍两种方式,一种是基于别名的形式,一种是基于jenv软件的形式。这里以Mac操作系统下的Java9为例演示基于别名的JDK切换。JDK安装在Mac下下载Java9的dmg安装包,按照步骤一路Next安装。安装完成后,Mac的/Library/Java/JavaVirtualMachines目录下会出现两个(如果安装了多个JDK,多个)目录:jdk-9.0.4.jdkjdk1.8.0_151.jdk除了目前主流的Java除了Java8之外,新的长期支持版本(LTS)还包括Java11和Java17,您可以根据需要关注它们。上面说明有两个JDK版本,其他版本可以对比一下。环境变量配置Mac可以通过bash_profile文件配置JDK的环境变量。执行以下命令打开配置文件:vim~/.bash_profile如果没有.bash_profile文件,则在运行vim~/.bash_profile命令时创建。参考原来的环境变量配置,添加JDK9的配置:#javaconfigexportJAVA_8_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home"exportJAVA_9_HOME="/Library/Java/JavaVirtualMachines/jdk-上面修改了两处:第一处定义了JAVA_8_HOME和JAVA_9_HOME的Home路径;第二处配置了jdk8和jdk9操作的别名(alias),保存上面修改的配置,执行以下命令制作bash_profile生效:source~/.bash_profile编译完成,相关配置完成,后面可以通过命令切换JDK。JDK环境切换上述配置中默认使用Java8,执行java-version命令可以验证:192:JavaVirtualMachineszzs$java-versionjavaversion"1.8.0_151"Java(TM)SERuntimeEnvironment(build1.8.0_151-b12)JavaHotSpot(TM)64-BitServerVM(build25.151-b12,混合模式)切换到Java9时,执行以下命令:192:JavaVirtualMachineszzs$jdk9192:JavaVirtualMachineszzs$java-versionjavaversion"9.0.4"Java(TM)SERuntimeEnvironment(build9.0.4+11)JavaHotSpot(TM)64-BitServerVM(build9.0.4+11,mixedmode)至此,已经切换到Java9。当然,如果你想切换回Java8,只需要执行jdk8。通过别名这种形式,可以配置多个JDK环境,但是在一些复杂的环境中,这种简单的手动切换就显得力不从心了。我们需要一个更方便、更细粒度的控制工具。这里推荐JEnv。正如官网所说,使用的是JEnv工具。JEnv是一个让你忘记如何配置JAVA_HOME的神器。您可以使用简单的命令在不同的Java版本之间切换。下面来看看JEnv的安装和基本使用。JEnv的安装MacOS下可以使用Homebrew安装JEnv:brewinstalljenv以上命令安装成功后,需要在.bash_profile中进行配置。安装时也会在控制台打印相应的配置内容。这里直接通过echo命令将内容添加到.bash_profile文件中:$echo'exportPATH="$HOME/.jenv/bin:$PATH"'>>~/.bash_profile$echo'eval"$(jenvinit-)"'>>~/.bash_profile安装完成,执行命令查看版本信息:$jenvversions*system(setby/Users/zzs/.jenv/version)from原来只有系统找到defaultJava,*表示当前选择的版本。尽管安装了其他版本的Java,但不会自动发现它们。仍然以当前的Java8和Java9环境为例,我们通过jenvadd命令在jenv中添加相应的Java路径:$jenvadd/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/oracle64-1.8.0.151added1.8.0.151added1.8added1.8.0.151alreadypresent,skipinstallationJava9addedtojenv:$jenvadd/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home/oracle64-9.0.4added9.0.4added9.0added9.0.4alreadypresent,skipinstallation现在运行查询版本信息命令:$jenvversions*system(setby/Users/zzs/.jenv/version)1.81.8.0.1519.09.0.4oracle64-1.8.0.151oracle64-9.0.4可以看到jenv中添加了Java8和Java9的JDK。但很明显,也增加了一些不需要的JDK版本,可以通过remove命令删除:$jenvremoveoracle64-1.8.0.151JDKoracle64-1.8.0.151removed删除不需要的版本后,再查看:$jenvversions*system(setby/Users/zzs/.jenv/version)1.8.0.1519.0.4只剩下1.8.0.151和9.0.4两个版本。JEnv的使用完成了以上安装,可以使用命令切换使用的Java版本:$jenvlocal1.8.0.151/usr/local/Cellar/jenv/0.5.5_2/libexec/libexec/jenv-version-file-write:line19:.java-version:Permissiondenied尝试使用时,没有出现预期的效果,报权限问题。这里可以使用doctor命令查看原因:$jenvdoctor[ERROR]JAVA_HOME变量已经设置,直接使用它的脚本不能使用jenv设置的java版本[OK]路径中的Java二进制文件是jenvshims[OK]Jenv正确加载第一行说明已经配置了JAVA_HOME变量,所以编辑.bash_profile文件,将原来的JAVA_HOME变量注释掉,再次执行:$jenvdoctor[OK]NoJAVA_HOMEset[OK]pathbinariesinpatharejenvshims[OK]Jenv正确加载经过以上操作,发现切换Java版本时仍然出现“Permissiondenied”问题,于是exit打开命令行窗口,重新打开,问题消失。切换前的版本:$java-versionopenjdkversion"17.0.4.1"2022-08-12OpenJDKRuntimeEnvironmentTemurin-17.0.4.1+1(build17.0.4.1+1)OpenJDK64-BitServerVMTemurin-17.0.4.1+1(build17.0.4.1+1,mixedmode,sharing)执行切换,切换后的版本:$jenvlocal1.8$java-versionjavaversion"1.8.0_151"Java(TM)SERuntimeEnvironment(build1.8.0_151-b12)JavaHotSpot(TM)64-BitServerVM(build25.151-b12,mixedmode)其中jenvlocal指定文件夹中的本地Java版本,也可以通过jenvglobal设置一个默认的Java版本,运行jenvwhichjava显示可用的已执行Java的完整路径。设置全局默认版本:jenvglobal1.8显示可执行java的完整路径:$jenvwhichjava/Users/zzs/.jenv/versions/1.8/bin/java也可以使用特定文件夹下的.java-version文件设置Java版本。$cat.java-version1.8在执行了jenvlocal1.8命令的目录下,可以看到生成了上述.java-version文件,文件中保存了Java版本号。比如在项目中使用Java8,只需要在.java-version文件中保存1.8为内容即可。进入这个文件夹后,JEnv会自动帮我设置本地的Java版本。PS:在以上操作的过程中,我们需要注意一些没有达到预期效果的时刻。可能是命令行窗口缓存的问题。可以尝试关闭命令行窗口,重新打开查看。JEnv实践这里创建一个基于Java17的项目java17-learnthroughIdea2022:.├──pom.xml└──src├──main│├──java││└──com││└──secbro2││└──Main.java│└──resources└──test└──java创建完成后,进入项目根目录,执行jenv命令,设置对应目录的环境变量为Java17:$jenvlocaltemurin64-17.0.4.1$java-versionopenjdkversion"17.0.4.1"2022-08-12OpenJDKRuntimeEnvironmentTemurin-17.0.4.1+1(build17.0.4.1+1)OpenJDK64-BitServerVMTemurin-17.0.4.1+1(build17.0.4.1+1,mixedmode,sharing)可以看到指定目录已经设置了对应的Java版本。这时如果用IDEA打开工程,会看到工程根目录下多了一个.java-version文件。打开文件,内容为:temurin64-17.0.4.1,新建的项目和全局默认的Java8一样,环境变量配置不冲突,可以正常运行。至此,JEnv的使用介绍完毕。总结本文针对Java多个版本环境变量的管理,带大家实践学习两种环境变量管理方式:一种比较粗放,基于环境变量命令别名的形式,当前环境变量是通过别名切换;另一种是利用三方工具JEnv完成多个Java版本的精准管理,可以细化到具体的文件目录。如果条件允许,推荐使用JEnv进行管理。
