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.jar
和b.JAR
,mylib/*
會被擴展爲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 後續總結
總而言之,首先應當檢查用法是否正確,然後再考慮是否是環境因素。