操作系统:windows10
JDK版本:JDK7,JDK8,JDK9
场景:单机安装多个版本JDK。
如果只想知道如何灵活切换JDK版本,可直接看5.总结。
Java开发者都知道安装JDK后要配置环境变量,通常我们都认为配置了JAVA_HOME和PATH、CLASSPATH后就万事大吉了。这在较低版本JDK(应该是7以下)、或者是单机只安装一个JDK的时候是没问题的。但是,当在单台机器上安装多个版本的JDK时就会有问题了。
由于版本发布顺序,以及在项目中使用和学习的顺序,JDK安装顺序如下:
JDK7->JDK8->JDK9
安装JDK8的时候修改环境变量到JDK8的安装目录,当时并没有留意到有什么不妥,由于开发时的IDE是可以配置JDK路径的,所以也没有影响。但是当我安装JDK9后问题就来了,此时环境变量仍然配置的JDK8的。执行java –version,如下图,显示版本是9.
但是JDK9是用于学习的,现在还不可能用来开发实际项目。
从网上找到的单机多版本JDK资料不多,只找到一篇比较合适的(由于当时没总结,原网址忘了),说C:\Windows\System32目录下有3个文件:java.exe,javaw.exe,javaws.exe。这三个文件时JDK安装时从 安装目录/bin路径下复制过来的。
我当时就从 JDK8安装目录/bin下复制替换了者3个文件(当然替换前备份一下)。然而并没有用。
当我再一次检查环境变量是否有误时发现了问题所在,如图:
JDK安装后竟然创建了一个目录并设置了环境变量!该路径下有3个熟悉的文件:java.exe,javaw.exe,javaws.exe。我不知道这是哪个版本的JDK会做的事,但是看路径应该是sun被Oracle收购后才有的神操作。
将JDK8安装目录/bin下的java.exe,javaw.exe,javaws.exe复制到C:\ProgramData\Oracle\Java\javapath,达到了预期的目的,如下图
根据path的配置顺序,java运行时的环境顺序应该是:
1)C:\ProgramData\Oracle\Java\javapath
2)C:\Windows\System32
3)%JAVA_HOME%\bin
4)%JAVA_HOME%\jre\bin
系统依顺序从上面几个路径中寻找java.exe,javaw.exe,javaws.exe这几个文件执行。
验证:
JAVA_HOME配置JDK8,C:\Windows\System32中放的是JDK7的文件
得出另一个结论:运行环境C:\Windows\System32和C:\ProgramData\Oracle\Java\javapath中文件来源的JDK版本要大于或者等于JAVA_HOME中的JDK版本。
此时C:\ProgramData\Oracle\Java\javapath路径下放1.9的文件
单机安装多个版本JDK时,如果想灵活切换JDK版本,按如下步骤切换:
1) 前提是各版本JDK正确安装成功,会正常配置环境变量,将环境变量配置为想用的JDK版本安装目录。
百度上太多了。
2) 配置完成后检查一下path是否存在如下(或类似)配置路径,如果没有就跳过
如果有,则从对应的版本(即想要配置的版本)安装目录/bin下复制java.exe,javaw.exe,javaws.exe这三个文件到该路径替换里面的文件。
3) 检查C:\Windows\System32下有没有java.exe,javaw.exe,javaws.exe这三个文件,如果有,则从对应的版本(即想要配置的版本)安装目录/bin下复制过来替换这三个文件。
4) 运行环境C:\Windows\System32和C:\ProgramData\Oracle\Java\javapath中文件来源的JDK版本要大于或者等于JAVA_HOME中的JDK版本。否则会报类似如下的运行环境错误:
下面几个问题我认为是可以的,但是还没验证,请小白鼠们自行验证:
1)是否可以直接删除path中的C:\ProgramData\Oracle\Java\javapath配置以及其文件,删除C:\Windows\System32中的java.exe,javaw.exe,javaws.exe,只保留手动设置的path配置?
我认为是可以的,但是注意C:\Windows\System32是系统目录,只能删除java.exe,javaw.exe,javaws.exe这几个文件,否则会有未知的问题。(未验证)
2)是否可以只保留C:\ProgramData\Oracle\Java\javapath而不用配置传统的JAVA_HOME和PATH、CLASSPATH?
应该是可以的,sun自动配置这个路径应该是为了减少手动配置环境的麻烦。(未验证)