问题再现与解读
- 首次,使用 java 命令+任意参数 都会报这个错误,最典型的就是
java -version
- 解读一下这个报错信息,注册表路径
SoftwareJavaSoftJava Runtime EnvironmentCurrentVersion
当前值是 1.8,但是 java 命令版本是 1.7
问题解决
方式一:删除C:WindowsSystem32
下的java.exe, javaw.exe, javaws.exe
方式二:修改环境变量顺序
这是我原本的 Path
环境变量配置:
%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;%SYSTEMROOT%System32WindowsPowerShellv1.0;%JAVA_HOME%in;
修改后把%JAVA_HOME%in
提前到%SystemRoot%system32;
之前
%JAVA_HOME%in;%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;%SYSTEMROOT%System32WindowsPowerShellv1.0;
问题分析过程
环境变量
Windows 中的 DOS 操作系统中的 Path
环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到 Path
中指定的路径去找。
java 命令,其实是由系统根据 Path
环境变量路径寻找 java.exe
程序来运行。
CMD - where 命令
描述:显示符合搜索模式的文件位置。在默认情况下,搜索是在当前目录和 PATH
环境变量指定的路径中执行的。
我们可以运行 where java
来查看
我的 java 1.8 安装在 D:libjdk1.8
, 但是 %SystemRoot%system32
(即对应C:WindowsSystem32
) 优先于 %JAVA_HOME%in
(即对应 D:libjdk1.8in
)匹配,所以找到了 C:WindowsSystem32java.exe
, 但是这是java 1.7的运行程序。
运行 regedit 打开注册表
点击 开始 --> 运行... --> 输入 regedit
, 回车 --> 打开注册表
找到 HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime Environment
, 就可以查看注册表属性了,我的 CurrentVersion
是 1.8
总结
- 使用
regedit
查看注册表中的 CurrentVersion - 使用
where java
查看路径 - 让注册表中的
CurrentVersion
和 where 命令找到的第一个java.exe
的版本保持一致!