有些时候,我们需要在电脑上安装多个板本的 JDK ,以适应不同板本的开发需求,同时部份软件需要指定的某个板本的 JDK 才能运行,一般这个时候我们也不想卸载原本的 JDK 再去安装新的,这时就需要对 JDK 进行一种方便的管理(通过改变环境变量)。

写这篇文章的起因是因为我在 Idea 中运行基于 JDK 1.8 的项目时没有问题,因为在Project Structure 中配置了 JDK 的目录,而改为使用java -jar xxx.jar方式运行时,

  • 报错:

    1
    java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
  • 原因:

    Java SE 9 及以上移除了 JAXB API(属于 JAVA EE API),因此对应的 JDK 也不再包含相关 jar 包,而我本地虽然配置的是 JDK 8 的环境变量,但是使用java -version 显示的是 jdk 11 板本,配置失效。

  • 解决:

    第一种方式:pom.xml 文件中,加入这些被移除的相关包。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
    </dependency>
    <dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
    </dependency>
    <dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
    </dependency>
    <dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
    </dependency>

    第二种方式:重新配置 JDK 环境变量(配置失效解决方案)。

    推荐阅读:https://www.cnblogs.com/Evanpie/p/14815043.html

    部份文章中的做法是删除文件或者 Path 中的一些环境变量,我的建议是不要删除,而是把自己配置的 JDK 移到顶部,因为系统是按照 Path 中以下路径的先后顺序来寻找 JDK 相关的可执行文件,找到后就不会再往下找。

    • C:\Program Files\Common Files\Oracle\Java\javapath
    • C:\ProgramData\Oracle\Java\javapath
    • C:\Windows\System32
    • D:Java\jdk1.8.0_291\bin(你配置的路径)

这时候再使用java -version就会发现 JDK 已经切换成功。

上面的配置方式无法很方便的切换 JDK 板本,有没有一种更方便的方式呢?

1. 通过配置环境变量手动切换 JDK

  1. 「系统变量」中新建CLASSPATH变量,值为如下;

    1
    .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
  2. 编辑「系统变量」中的Path,在最前面加入以下值;

    1
    %JAVA_HOME%\bin
  3. 新增JAVA_HOME环境变量。

    比如我的系统有三个板本的 JDK ,那么我需要添加如下变量。

变量
JAVA_HOME %JAVA_HOME8%
JAVA_HOME8 D:\Java\jdk1.8.0_291
JAVA_HOME11 D:\Java\jdk-11.0.11
JAVA_HOME12 D:\Java\jdk-12
  1. 以后通过修改JAVA_HOME的值切换 JDK,到此就满足基本需求了。

2. 通过 JEnv 工具切换 JDK

使用这种方式需要先删除上面配置的 JAVA_HOME

Github 地址:https://github.com/FelixSelter/JEnv-for-Windows

  1. 克隆该库;

    1
    git clone https://github.com/FelixSelter/JEnv-for-Windows.git
  2. 将该工具加入Path环境变量;

  3. 扫描 jdk 路径并添加 jdk;

    1
    jenv autoscan D:\java # 选择你所有 JDK 所在的目录

    需要根据提示修改 jdk 的名称

  4. 修改全局 JDK 板本;

    1
    jenv change jdk8
  5. 其他命令。

    1
    2
    jenv remove <jdkname>
    jenv list

参考文章: