問題再現與解讀
- 首次,使用 java 命令+任意參數 都會報這個錯誤,最典型的就是
java -version
- 解讀一下這個報錯信息,注冊表路徑
Software\JavaSoft\Java Runtime Environment\CurrentVersion
當前值是 1.8,但是 java 命令版本是 1.7
問題解決
方式一:刪除C:\Windows\System32
下的java.exe, javaw.exe, javaws.exe
方式二:修改環境變量順序
這是我原本的 Path
環境變量配置:
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%JAVA_HOME%\bin;
修改后把%JAVA_HOME%\bin
提前到%SystemRoot%\system32;
之前
%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
問題分析過程
環境變量
Windows 中的 DOS 操作系統中的 Path
環境變量,當要求系統運行一個程序而沒有告訴它程序所在的完整路徑時,系統除了在當前目錄下面尋找此程序外,還應到 Path
中指定的路徑去找。
java 命令,其實是由系統根據 Path
環境變量路徑尋找 java.exe
程序來運行。
CMD - where 命令
描述:顯示符合搜索模式的文件位置。在默認情況下,搜索是在當前目錄和 PATH
環境變量指定的路徑中執行的。
我們可以運行 where java
來查看
我的 java 1.8 安裝在 D:\lib\jdk1.8\
, 但是 %SystemRoot%\system32
(即對應C:\Windows\System32
) 優先於 %JAVA_HOME%\bin
(即對應 D:\lib\jdk1.8\bin
)匹配,所以找到了 C:\Windows\System32\java.exe
, 但是這是java 1.7的運行程序。
運行 regedit 打開注冊表
點擊 開始 --> 運行... --> 輸入 regedit
, 回車 --> 打開注冊表
找到 HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\
, 就可以查看注冊表屬性了,我的 CurrentVersion
是 1.8
總結
- 使用
regedit
查看注冊表中的 CurrentVersion - 使用
where java
查看路徑 - 讓注冊表中的
CurrentVersion
和 where 命令找到的第一個java.exe
的版本保持一致!