Server2016下JDK与JRE的java.exe差异及运行报错排查
解答:JDK与JRE的java.exe差异及报错原因
一、JDK与JRE中java.exe的核心差异
这两个java.exe都是JVM的启动器,但定位和运行逻辑完全不同:
- JDK的java.exe:面向开发场景的启动器,会额外加载开发环境相关的配置、工具类路径,还会检查一些开发特有的目录和旧机制。简单说,它带着开发环境的“附加逻辑”,启动流程更复杂。
- JRE的java.exe:纯运行时的启动器,只负责加载运行Java程序必需的核心类库和配置,不会处理开发相关的额外检测逻辑,启动逻辑更轻量化、更专注于运行本身。
举个直观的例子:JDK的java.exe不仅能运行程序,还能关联编译工具(javac)、调试工具的路径;而JRE的java.exe只关心怎么把你的jar/class文件跑起来,其他一概不管。
二、JDK的java.exe报错的原因
你的报错信息已经点明了核心问题:
return (<JAVA_HOME>/lib/ext exists, extensions mechanism no longer supported; Use -classpath instead. Error: Could not create the Java Virtual Machine. )
从Java 9开始,Oracle就彻底废弃了lib/ext这个旧扩展机制(早年用来添加第三方类库的方式),到Java 10时完全移除了对它的支持。而你的JDK安装目录(C:\java)里恰好存在lib/ext目录,JDK的java.exe启动时会主动检测这个目录,发现后直接抛出废弃提示,进而导致JVM启动失败。
至于JRE的java.exe能正常运行,是因为JRE的启动器根本不会去检测JDK特有的lib/ext目录——它的运行时逻辑里没有这个检测步骤,所以即使JDK目录下有这个目录,你进入JRE的bin目录运行时,完全不会触发这个检查,自然能正常显示版本。
三、快速解决方法
- 删除JDK目录下的
lib/ext文件夹:Java 10已经不支持这个机制了,留着只会引发冲突,直接删掉即可。 - 调整PATH顺序:确保
C:\java\bin排在C:\Program Files (x86)\Common Files\Oracle\Java\javapath前面,避免系统调用到冲突的Java启动器。 - 验证效果:删除目录后,打开新的命令行窗口(一定要开新窗口,避免PATH缓存影响),执行
java -version,应该就能正常显示JDK 10.0.1的版本信息了。
内容的提问来源于stack exchange,提问作者NamedArray
相关产品推荐
相关产品推荐

