問題再現與解讀

- 首次,使用 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的版本保持一致!
