因JDK版本冲突导致问题的一系列解决方案

时间:2022-08-04 17:12:29
日常做系统应用时,经常会在服务器上安装各种各样的用到JRE的软件,有些软件还自带虚拟机或者JDK,Windows系统通过注册表来管理当前系统所使用的虚拟机和JDK路径,因此,当安装的软件JDK版本和windows已经安装的版本不一致时,若安装软件操作了注册表,就会出现各种各样的问题。其中一个,就是“载入JAVA VM时windows出现错误:3”,其他的错误,大同小异,基本都是版本冲突导致的问题,若要解决类似的问题,先要从系统的JAVA虚拟机管理说起:   首先,需要缺保以下三个键值中关于虚拟机的版本描述数据是一致的,若不一致,修改为一致。 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit 
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Plug-in 
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment 
当JAVA.EXE运行时,其有一套JVM的加载机制,机制是这样的: 假如存在../jre/bin/java.dll文件,则查找../jre/lib/ jvm.cfg文件,在该文件中,第1个被列出的jvm.dll类型作为缺省值(假如在java.exe命令行指定了jvm.dll的类型,则使用指定类型)。jvm.dll类型分为hotspot,classic,server三种。假如不存在../jre/lib/jvm.cfg文件,则打印下面的错误信息:
Error: could not open 'c:\jdk1.3\jre\lib\jvm.cfg'
如不存在../jre/bin/java.dll(当运行的是winnt\system32\java.exe),则注册表将在此时发挥作用,HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ CurrentVersion键值所记录的实际上是winnt\system32\java.exe的版本值
  同时java.exe程序内部本身也有一个标识自身的版本值,java.exe根据自己内部的版本值和CurrentVersion值相比较: 1、如果发现两个值相等,则将在HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\MainVersion.MicroVersion项下获取JRE所在目录及动态链接库,这两个键的名称分别是JavaHome和RuntimeLib,MainVersion表示主版本号,MicroVersion表示次版本号。
2、如果java.exe内部版本值和CurrentVersion不一致,则报类似以下的错误:   
  Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion'
  has value '1.X', but '1.Y' is required.
此时,若手工修改,基本上可以解决问题,但是最好的方法还是卸载以前的老版本JDK,重新安装新版本的JDK来保持各键值关联是一致的。   如果以上设定都无问题,但是在运行一些AnyWhere制作的安装包或者一些依赖JDK运行的软件时,报出“载入JAVA VM时windows出现错误:3”时,就要注意在系统变量设定中,是否有一些软件的JAVA运行路径在系统JDK运行路径之前,比如Oracle,安装后,会将自己的java.exe运行路径排在系统路径前,此时只要把系统的PATH路径设定,修改为系统路径在前,即可解决问题!
原文网址:http://blog.sina.com.cn/s/blog_7250360c0100lhm3.html