windows下切换JDK8、JDK11、JDK17

news2024/11/26 13:35:04

问题背景:

需要同时使用不同版本的JDK进行开发和运行,可通过下述操作改变JDK版本。

 

一、java分类以及JDK、JRE、JVM的联系

1、JAVA分类

JAVA EE——Java Enterprise Edition, JAVA企业版,主要用于WEB开发。

JAVA SE——Java Standard Edition, JAVA标准版,主要用于应用程序开发。

JAVA ME——Java Micro Edition, JAVA移动版(微型版),主要用于移动设备、嵌入式设备上的java应用程序开发。

 

2、JDK、JRE、JVM的区别

2.1.JDK

JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。
JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
①SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
②EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。
③ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。

 

2.2.JRE

是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。

 

2.3.JVM

是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

 

2.4.三者的关系

简单来说就是JDK包含JRE,JRE又包含JVM的关系

 

二、JDK各版本特性总结以及下载链接

1、JDK各版本官方下载地址(官方下载需要Oracle账号[免费])

 Java Archive | Oracle

 

版本

名称

发行日期

JDK 1.1.4

Sparkler(宝石)

1997-09-12

JDK 1.1.5

Pumpkin(南瓜)

1997-12-13

JDK 1.1.6

Abigail(阿比盖尔–女子名)

1998-04-24

JDK 1.1.7

Brutus(布鲁图–古罗马政治家和将军)

1998-09-28

JDK 1.1.8

Chelsea(切尔西–城市名)

1999-04-08

J2SE 1.2

Playground(运动场)

1998-12-04

J2SE 1.2.1

none(无)

1999-03-30

J2SE 1.2.2

Cricket(蟋蟀)

1999-07-08

J2SE 1.3

Kestrel(美洲红隼)

2000-05-08

J2SE 1.3.1

Ladybird(瓢虫)

2001-05-17

J2SE 1.4.0

Merlin(灰背隼)

2002-02-13

J2SE 1.4.1

grasshopper(蚱蜢)

2002-09-16

J2SE 1.4.2

Mantis(螳螂)

2003-06-26

J2SE 5.0

2004-09

Java SE 5.0 (1.5.0)

Tiger(老虎)

2004-09-30

Java SE 6.0 (1.6.0)

Mustang(野马)

2006-04

Java SE 7.0 (1.7.0)

Dolphin(海豚)

2011-07-28

Java SE 8.0 (1.8.0) (LST)

Spider(蜘蛛)

2014-03-18

Java SE 9

2017-09-21

Java SE 10

2018-03-14

Java SE 11 (LST)

2018-09-26

Java SE 12

2019-03-20

Java SE 13

2019-09-17

Java SE 14

2020-03-17

Java SE 15

2020-09

Java SE 16

2021-03

Java SE 17 (LST)

2021-09

Java SE 18

2022-03-22 

Java SE 19

2022-09-20

Java SE 20

2023-03

Java SE 21

2023-09

Java SE 22

2024-03

 

2、JDK各版本特性总结参考链接

JDK各版本特性总结-CSDN博客

 

三、Windows使用JEnv实现JDK多版本管理

1、分别安装多个版本的JDK

根据实际情况选择不同版本的JDK进行安装。

我选择安装JDK8JDK11JDK17

 

1.1.下载各版本JDK

官方下载地址(官方下载需要Oracle账号[免费]): Java Archive | Oracle

下载下述版本的内容

 

1.2.安装JDK8

具体安装步骤可以参考: java 8安装教程_java8安装-CSDN博客

 

1.3.安装JDK11JDK17

找到JDK8的安装目录,将JDK11JDK17压缩包解压到此文件夹下。

解压后的内容如下

 

2、JEnv下载、安装和常用命令

JEnv是一个帮助我们管理多个JDK安装的工具,并将每个代码库配置为使用特定的JDK版本,而不必改变JAVA_HOME环境变量.

2.1.下载JEnv

下载链接: https://github.com/FelixSelter/JEnv-for-Windows/releases

 

2.2.安装JEnv

将下载好的JEnv文件解压到上述jdk各版本文件夹下,解压后的内容如下(JEnv是一个自定义的文件夹,里面是JEnv文件解压后的内容)

 

2.3.JEnvjenv.bat所在路径放于系统环境变量path

右击“此电脑”,然后选择“属性”,再点击“高级系统设置”,再点击 “环境变量”,如下图:

 

找到Path,选中,再点击“编辑”

 

然后点击“新建”,把JEnvjenv.bat所在路径放入到这里后点击"确定"

 

dos窗口中,输入jenv检测是否添加JEnv成功

 

2.4.JEnv命令

若执行命令时出现下图内容,需要新增一个名为JAVA_HOME的环境变量,值可以任意填一个jdk的目录,到bin上一级即可(如: C:\Program Files\Java\jdk-1.8)

 

dos窗口中,可以查询当前使用的jdk版本。

java -version

 

2.4.1.添加JDK版本和路径(若路径中含空格,需要用英文引号括起来)

jenv add <name> <java_Path>

如:jenv add jdk8 "C:\Program Files\Java\jdk-1.8"

 

2.4.2.查看已添加的JDK版本

jenv list

 

2.4.3.切换JDK版本

jenv change <name>

如:jenv change java8

 

2.4.4.从 JEnv 列表中删除现有 JDK

jenv remove <name>

示例:jenv remove java8

 

2.5.JEnv命令实例

2.5.1.jenv add和jenv list

 

2.5.2.jenv list、jenv change和java -version

 

四、用代码的方式验证JDK版本切换是否成功

参考 java 8安装教程_java8安装-CSDN博客 中编译运行代码的内容验证JDK版本切换是否成功。

代码内容如下:

public class demo { // 声明一个名为demo的公共类

 

    public static void main(String []args){ // 这是程序的主入口点。当Java应用程序运行时,它是首先执行的

 

        String jdkVersion = System.getProperty("java.version"); // 使用System.getProperty方法获取系统属性"java.version",它表示当前正在运行的JDK版本,并将其存储在字符串变量jdkVersion

 

        System.out.println("当前JDK版本为:" + jdkVersion); // 打印一条消息,显示当前正在运行的JDK版本

    } // 结束主方法

 

} // 结束demo

 

编译运行截图如下:

 

注意:

执行代码时,若出现java MainDemo执行main方法报错

Error: A JNI error has occurred, please check your installation and try again

Exception in thread "main" java.lang.UnsupportedClassVersionError: MainDemo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0

        at java.lang.ClassLoader.defineClass1(Native Method)

        at java.lang.ClassLoader.defineClass(Unknown Source)

        at java.security.SecureClassLoader.defineClass(Unknown Source)

        at java.net.URLClassLoader.defineClass(Unknown Source)

        at java.net.URLClassLoader.access$100(Unknown Source)

        at java.net.URLClassLoader$1.run(Unknown Source)

        at java.net.URLClassLoader$1.run(Unknown Source)

        at java.security.AccessController.doPrivileged(Native Method)

        at java.net.URLClassLoader.findClass(Unknown Source)

        at java.lang.ClassLoader.loadClass(Unknown Source)

        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

        at java.lang.ClassLoader.loadClass(Unknown Source)

        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

 

问题在于用低版本的jdk编译的class文件,然后在高版本的JVM上运行所导致的,即编译运行版本不匹配。因此可以在新的dos窗口中用javac demo.java编译,再运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1332400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题--- 组合总和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…

计算机是如何工作的(下)

4. 编程语言&#xff08;Program Language&#xff09; 本块内容主要是还原下我们已经熟悉的编程语言&#xff0c;即编程语言是如何和 CPU 指令对应起来的。 4.1 程序&#xff08;Program&#xff09; 所谓程序&#xff0c;就是一组指令以及这组指令要处理的数据。狭义上来说&…

python dash学习2

代码 内有说明&#xff1a; from dash import Dash, html, dcc, callback, Output, Input import plotly.express as px import pandas as pd# 从 Plotly 数据集中读取数据 df pd.read_csv(https://raw.githubusercontent.com/plotly/datasets/master/gapminder_unfiltered.c…

Html / CSS刷题笔记

WebKit是一个开源的浏览器引擎&#xff0c;它最初是由苹果公司开发的&#xff0c;并且被广泛用于Safari浏览器和其他基于WebKit的浏览器&#xff0c;比如Google Chrome的早期版本。它也是构建许多移动设备浏览器的基础。WebKit的主要功能是解析HTML和CSS&#xff0c;并将其渲染…

vue3(五)-基础入门之计算属性

一、计算属性 1.计算属性与普通方法的的区别&#xff1a; 计算属性在需要渲染数据时调用一次&#xff0c;而后将结果缓存起来。只有计算属性所依赖的数据发生改变时才会重新调用函数&#xff0c;否则每次渲染相同的数据都只会从缓存中读取。 普通方法在每次数据需要渲染时都会…

prometheus二进制安装

1、在需要安装prometheus的目录下执行wget命令下载软件到本地&#xff0c;如我的路径是/opt/module/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz正在解析主机 objects.githubusercontent.com …

Head First Design Patterns - 策略模式

策略模式 策略模式&#xff1a;策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化&#xff0c;行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可…

05_符号表

05_符号表 一、符号表符号表API设计符号表实现有序符号表 一、符号表 符号表最主要的目的就是将一个键和一个值联系起来&#xff0c;符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据&#xff0c;我们可以根据键来查找对应的值。符号表中&#xff0c;键具有唯…

2024华为OD机试真题指南宝典—持续更新(JAVAPythonC++JS)【彻底搞懂算法和数据结构—算法之翼】

PC端可直接搜索关键词 快捷键&#xff1a;CtrlF 年份关键字、题目关键字等等 注意看本文目录-快速了解本专栏 文章目录 &#x1f431;2024年华为OD机试真题&#xff08;马上更新&#xff09;&#x1f439;2023年华为OD机试真题&#xff08;更新中&#xff09;&#x1f436;新…

1.倒排索引 2.逻辑斯提回归算法

1.倒排索引 https://help.aliyun.com/zh/open-search/retrieval-engine-edition/introduction-to-inverted-indexes 倒排索引&#xff08;Inverted Index&#xff09;是一种数据结构&#xff0c;用于快速查找包含某个特定词或词语的文档。它主要用于全文搜索引擎等应用&#…

解锁JDK 12的奇妙之旅:新特性详解

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 解锁JDK 12的奇妙之旅&#xff1a;新特性详解 前言switch表达式拓展NumberFormat对复杂数字的格式化字符串支持transform、indent操作新增方法Files.mismatch(Path, Path)Teeing Collector支持unicode…

AG16KDDF256 User Manual

AGM AG16KDDF256 是由 AGM FPGA AG16K 与 DDR-SDRAM 叠封集成的芯片&#xff0c;具有 AG16K FPGA的可编程功能&#xff0c;提供更多可编程 IO&#xff0c;同时内部连接大容量 DDR-SDRAM。  FPGA 外部管脚 FBGA256 封装&#xff0c;管脚说明请见下表 Table-1&#xff1a; Tab…

微服务实战系列之Dubbo(上)

前言 随着一年一度冬至的到来&#xff0c;2023的步伐也将远去。而博主的系列文章&#xff0c;也将从今天起&#xff0c;越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面&#xff0c;无论使用什么框架、组件或工具&#xff0c;皆可拿来用之。 那么…

探秘JDK 13的黑科技:新特性一览

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘JDK 13的黑科技&#xff1a;新特性一览 前言switch表达式扩展Switch表达式的基本概念&#xff1a;使用Switch表达式的优势&#xff1a;示例代码&#xff1a;注意事项和最佳实践&#xff1a; Text …

【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中&#xff0c;控制成员&#xff08;变量、方法、类等&#xff09;可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C、Java、PHP所使用的访问限制关键字和约定&#xff1a; 一、JavaScript ### JavaScript访问限制 早期的JavaScript并没有类似…

Selenium4+Python3 - Iframe、Select控件、交互式弹出框、执行JS、Cookie操作

一、iframe操作 iframe识别&#xff1a; 语法&#xff1a; driver.switch_to.frame(‘方式’) 1、常见处理方法三种 index&#xff1a;下标name&#xff1a;id或name属性的值webelement&#xff1a;元素 2、通过下标进入 进入第一个iframe&#xff1a; driver.switch_to.…

【什么是反射机制?为什么反射慢?】

✅ 什么是反射机制&#xff1f;为什么反射慢&#xff1f; ✅典型解析✅拓展知识仓✅反射常见的应用场景✅反射和Class的关系 ✅典型解析 反射机制指的是程序在运行时能够获取自身的信息。在iava中&#xff0c;只要给定类的名字&#xff0c;那么就可以通过反射机制来获得类的所有…

C++笔试训练day_2

文章目录 选择题7. 编程题1.2. 选择题 &#xff08;6&#xff09;因为p2被const修饰所以p2不可以被改变&#xff0c;但是p2的指向可以被改变 &#xff08;7&#xff09;因为指针p3被const修饰&#xff0c;所以p3的指向不能被改变&#xff0c;但是*p3可以被改变 int main() {in…

spring boot集成mybatis和springsecurity实现权限控制功能

上一篇已经实现了登录认证功能&#xff0c;这一篇继续实现权限控制功能&#xff0c;文中代码只贴出来和上一篇不一样的修改的地方&#xff0c;完整代码可结合上一篇一起整理spring boot集成mybatis和springsecurity实现登录认证功能-CSDN博客 数据库建表 权限控制的意思就是根…

前端常用的工具网站

前端常用的工具网站&#x1f516; 文章目录 前端常用的工具网站&#x1f516;1. 图片在线压缩2. iconfont--矢量图标3. JSON在线格式化4. EMOJIALL--表情符号5. removebg--去除图片背景6. FREE API--免费API接口7. Lorem picsum --随机图片8.UU在线工具 -- 聚合工具 1. 图片在线…