對 java 命令進行故障排除

此示例涵蓋使用’java’命令時的常見錯誤。

沒有找到指令

如果你收到如下錯誤訊息:

java: command not found

在嘗試執行 java 命令時,這意味著 shell 的命令搜尋路徑上沒有 java 命令。原因可能是:

  • 你根本沒有安裝 Java JRE 或 JDK,
  • 你還沒有在 shell 初始化檔案中更新 PATH 環境變數(正確),或者
  • 你還沒有獲取當前 shell 中的相關初始化檔案。

有關你需要執行的步驟,請參閱 “安裝 Java”

無法找到或載入主類

如果 java 命令無法找到/載入你指定的入口點類,則會輸出此錯誤訊息。一般而言,這可能有三個原因:

  • 你已指定了不存在的入口點類。
  • 該類存在,但你指定的不正確。
  • 該類存在並且你已正確指定它,但 Java 無法找到它,因為類路徑不正確。

以下是診斷和解決問題的過程:

  1. 找出入口點類的全名。

    • 如果你有類的原始碼,則全名由包名稱和簡單類名組成。Main 類的例項在包“com.example.myapp”中宣告,然後其全名是“com.example.myapp.Main”。
    • 如果你有一個已編譯的類檔案,你可以通過執行 javap 找到類名。
    • 如果類檔案位於目錄中,則可以從目錄名稱推斷出完整的類名。
    • 如果類檔案位於 JAR 或 ZIP 檔案中,則可以從 JAR 或 ZIP 檔案中的檔案路徑推斷出完整的類名。
  2. 檢視 java 命令的錯誤訊息。該訊息應以 java 嘗試使用的完整類名結束。

    • 檢查它是否與入口點類的完整類名完全匹配。
    • 它不應該以“.java”或“.class”結尾。
    • 它不應包含斜槓或 Java 識別符號 1 中 不合法的任何其他字元。
    • 名稱的大小寫應與完整的類名完全匹配。
  3. 如果你使用正確的類名,請確保該類實際上在類路徑上:

    • 計算出類名對映到的路徑名; 請參閱將類名對映到路徑名
    • 弄清楚類路徑是什麼; 請參閱此示例: 指定類路徑的不同方法
    • 檢視類路徑上的每個 JAR 和 ZIP 檔案,看它們是否包含具有所需路徑名的類。
    • 檢視每個目錄以檢視路徑名是否解析為目錄中的檔案。

如果手動檢查類路徑沒有找到問題,可以新增 -Xdiag-XshowSettings 選項。前者列出了所有載入的類,後者列出了包含 JVM 有效類路徑的設定。

最後,這個問題有一些不明原因:

  • 具有 Main-Class 屬性的可執行 JAR 檔案,該屬性指定不存在的類。
  • 具有錯誤 Class-Path 屬性的可執行 JAR 檔案。
  • 如果你在類名之前搞亂了 2 個 選項,java 命令可能會嘗試將其中一個解釋為類名。
  • 如果有人忽略了 Java 樣式規則並使用了僅在字母大小寫方面不同的包或類識別符號,並且你在平臺上執行將檔名中的字母大小寫視為不重要。
  • 程式碼或命令列中類名中的同形字元問題。

“在類<name>中找不到主要方法”

java 命令能夠找到並載入你指定的類但是無法找到入口點方法時,會發生此問題。

有三種可能的解釋:

  • 如果你嘗試執行可執行 JAR 檔案,則 JAR 的清單具有不正確的“Main-Class”屬性,該屬性指定的類不是有效的入口點類。
  • 你告訴 java 命令一個不是入口點類的類。
  • 入口點類不正確; 有關詳細資訊,請參閱入口點類

其他資源

1 - 從 Java 8 及更高版本開始,java 命令將有助於將檔名分隔符(“/”或“”)對映到句點(“。”)。但是,手冊頁中未記錄此行為。

2 - 一個非常模糊的情況是,如果你從格式化文件中複製並貼上命令,其中文字編輯器使用長連字元而不是常規連字元。