怎样安装两个不同版本的jdk,并且切换自如

/ 默认分类 / 1 条评论 / 863浏览

怎样安装两个不同版本的jdk

1。背景

大家都知道,近年来,oracle改变了之前多年才更新一个新版本的传统,现在基本每半年就会发布一个新的版本,从2017年9月发布jdk9之后到现在的2020年9月即将迎来的jdk15,这实在是太尼玛快了吧,不过对于这么多的版本,其实官方也说明了,不是每一个版本都推荐在生产上使用的,因为很多版本并不是长期支持的,就目前来说,市面上最常用的仍然是jdk8,如果想升级jdk,那么一般的选择应该是直接上11,不过项目的升级可能会是一个痛苦的过程。另外大家应该也都注意到了,近年来,全球政治经济局面紧张,咱们和米国的关系也是僵持不下,很多在国内十分流行的开源产品都遭到了一定的影响,最典型的就是最近一直受到关注的docker了,当然对于java,咱们都知道Oracle和米国是一条船上的,所以目前国内很多企业也是渐渐的在往openjdk上转移,关于openjdk咱们后面再和大家聊一聊,感兴趣的小伙伴也可以去搜索一下。下面咱们还是回归正题,来谈一谈版本更新迭代如此之快的情况下,我们怎样在一台机器上安装两个版本的jdk,并且可以切换自如呢?

2.内容

  1. 首先我们需要装好两个版本的jdk文件,像这样:

安装文件包已经准备好了,放在下面的百度网盘中,可以自行下载

地址: https://pan.baidu.com/s/1p_P2C8xCfBNbg9fCElDUGA
提取码:1234

  1. 安装好后我们还是按照正常的步骤来配置环境变量JAVA_HOME

  1. 再配置一下环境变量

配置好环境变量path:

环境变量的解释自行百度,大致如下

JAVA_HOME
变量名:JAVA_HOME
变量值:E:\java\jdk7
用途:定义一个变量,供其他地方使用
PATH
变量名:Path
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
用途:让系统在任何路径下都可以识别java、javac、javap等命令
CLASSPATH
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
用途:告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件,.;表示当前路径,tools.jar和dt.jar为类库路径
CLASSPATH详解
tools.jar
	工具类库(编译和运行等),它跟我们程序中用到的基础类库没有关系。我们注意到在Path中变量值bin目录下的各个exe工具的大小都很小,一般都在27KB左右,这是因为它们实际上仅仅相当于是一层代码的包装,这些工具的实现所要用到的类库都在tools.jar中,用压缩软件打开tools.jar,你会发现有很多文件是和bin目录下的exe工具相对性的,查看图一。当然,如果tools.jar的功能只有这些的话,那么我们根本不用把它加入到CLASSPATH变量中,因为bin目录下的工具自己可以完成对这些类库的调用,因此tools.jar应该还有其他的功能。在里面还可以看到有Applet和RMI等相关的文件,因此tools.jar应该还是远程调用等必须的jar包。tools.jar的其他作用可以查看其他资料。

dt.jar
	运行环境类库,主要是Swing包,这一点通过用压缩软件打开dt.jar也可以看到。如果在开发时候没有用到Swing包,那么可以不用将dt.jar添加到CLASSPATH变量中。

CLASSPATH中的类库是由Application ClassLoader或者我们自定义的类加载器来加载的,这里当然不能包括基础类库,如果包括基础类库的话,并用两个不同的自定义类加载器去加载该基础类,那它得到的该基础类就不是唯一的了,这样便不能保证Java类的安全性。

基本类库和扩展类库rt.jar
	基本类库是所有的 import java.* 开头的类,在 %JAVA_HOME%\jre\lib 目录下(如其中的 rt.jar、resource.jar ),类加载机制提到,该目录下的类会由 Bootstrap ClassLoader 自动加载,并通过亲委派模型保证了基础类库只会被Bootstrap ClassLoader加载,这也就保证了基础类的唯一性。
	扩展类库是所有的 import javax.* 开头的类,在 %JAVA_HOME%\jre\lib\ext 目录下,该目录下的类是由Extension ClassLoader 自动加载,不需要我们指定。
	rt.jar 默认就在根classloader的加载路径里面,放在claspath也是多此一举
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

4.大家应该已经发现了,这样配置的好处是,我们如果需要切换系统使用jdk的版本,只需要直接切换JAVA_HOME即可,配置好上面的信息后,其实我们就已经完成了java的环境变量的配置了,只是现在会有一个问题,就是我们切换JAVA_HOME也是没有效果的,执行java -version始终都是显示jdk8

5.为什么会出现上面的情况呢?其实很简单,我在安装两个版本的jdk时,首先安装的是java8,所以系统会自动帮我你们把执行文件放入到path系统变量下,也就是这样的:

如果你查看下你系统变量下的path,你会发现有一个这样的值:
C:\ProgramData\Oracle\Java\javapath 我们只要去到这个目录下删掉里面的可执行java程序即可

6.删除之后,我就可以通过控制JAVA_HOME来动态切换当前系统使用的java版本了

需要说明的是,修改了JAVA_HOME之后,需要重新开一个dos后者powershell窗口执行java -version命令才会显示出最新的系统环境情况。否则会没有变化。

3. 总结

上面就是今天和大家分享的一个小技巧,如果各位大佬有什么更好的办法欢迎来大力吐槽评论,白白ヾ(•ω•`)o