[Java常見問題] - 找不到或無法加載主類

0 修訂記錄

時間 描述
2019-07-30 建檔

1 異常描述

利用JDK1.8.0_102的java命令試圖啓動某個應用程序時提示下述錯誤:

錯誤:找不到或無法加載主類 [MainClass]

2 解決方案

以下結合了網友提供的各種成功的嘗試:

方案 意見
重啓計算機 可以嘗試
刪除CLASSPATH環境變量(加重啓) 作用不大
檢查類路徑是否正確 推薦
瞭解JDK版本差異

2.1 重啓計算機

極個別網友嘗試成功了,但原理不清楚。畢竟重啓能解決百分之八十詭異的問題。

2.2 刪除CLASSPATH變量

有網友認爲JDK8無需配置CLASSPATH環境變量,在刪除該變量並重啓後成功解決了本問題。然而Java SE7對java -cp的解釋如下:

指定一個目錄、JAR文件和ZIP列表用於搜索指定的類文件。-cp-classpath會覆蓋CLASSPATH環境變量;若兩者都未指定,則默認類路徑爲當前目錄.。 –《Java SE7 Documentation》

理論上來講,CLASSPATH環境變量並不會對java -cp命令造成影響。

2.3 類路徑寫法錯誤

說來慚愧。雖然正確地使用java命令是基本的要求,但此前確實沒有認真研究過相關命令的使用,因此忽略了用法錯誤這種可能性。

在編寫BAT腳本的過程中,筆者從某個博客上看到java -cp [pathTo]/*.jar的寫法,於是以該寫法爲主,嘗試了下述幾種寫法:

java -cp ../lib [MainClass]
java -cp ../lib/*.jar [MainClass]
java -cp ../lib/xxx.jar [MainClass]

如你所見,均沒有成功。在記錄本次解決過程的時候,筆者閱讀了Java SE的文檔,在java命令中關於-cp選項的描述裏看到了關於*的用法:

類路徑中包含*等同於指定了該目錄下所有.jar.JAR文件。如/mylib下存在a.jarb.JARmylib/*會被擴展爲a.jar:b.JAR。 –《Java SE7 Documentation》

於是筆者嘗試去掉了*後面的文件後綴.jar,成功運行應用程序。

注:經測試,在JDK7下*的用法也是不加文件後綴。

2.4 JDK版本的差異

有趣的是,即使通過2.3小節成功在JDK8下執行了java -cp ../lib/* [MainClass],但仍舊無法執行java -cp ../lib/xxx.jar [MainClass]

注:JDK7下能正常執行。

目前尚不清楚JDK8是否對java -cp的使用方式做了修改,因爲Java SE8文檔 並沒有在java指令的標準選項中列出-cp。也有可能是102版本太新的緣故,因此,推薦使用2.3小節的方式。

3 後續總結

總而言之,首先應當檢查用法是否正確,然後再考慮是否是環境因素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章