解決運行jar包出錯:ClassNotFoundException問題
Java命令運行jar 報錯
運行jar命令
java -jar xxx.jar
報錯:
Caused by: java.lang.ClassNotFoundException:
原因:要運行的jar缺少依賴包
執行jar正確命令:
java -Xbootclasspath/a:/home/webuser/gogoal_platform/ggopenapi/lib/snakeyaml.jar -jar xxx.jar
解釋:
-Xbootclasspath
:完全取代系統Java classpath.最好不用。-Xbootclasspath/a
: 在系統class加載後加載。一般用這個。-Xbootclasspath/p
: 在系統class加載前加載,註意使用,和系統類沖突就不好瞭.
win32 java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar unix java -Xbootclasspath/a: some.jar:some2.jar: -jar test.jar
win32系統每個jar用分號隔開,unix系統下用冒號隔開
方式二
AppClassloader來加載
這樣就不需要classpath參數瞭
我們在MANIFEST.MF中添加如下代碼:
Class-Path: lib/some.jar
lib是和test.jar同目錄的一個子目錄,test.jar要引用的some.jar包就在這裡面。
(這裡我剛開始理解成瞭把lib文件夾也打包進test.jar中,實踐後沒有成功,實際情況是lib和test.jar,是同一個目錄一個層次級別的)然後測試運行,一切正常!
如果有多個jar包需要引用的情況:
Class-Path: lib/some.jar lib/some2.jar
每個單獨的jar用空格隔開就可以瞭。註意使用相對路徑。
另:如果META-INF
下包含INDEX.LIST文件的話,可能會使Class-Path配置失效。INDEX.LIST是Jar打包工具打包時生成的索引文件,刪除對運行不產生影響。
jar包運行報錯:Invalid or corrupt jarfile
執行:
java -jar xxx.jar
運行一個jar包時,提示報錯:
Invalid or corrupt jarfile
該jar之前一直是正常運行的,這次隻是增加瞭一項圖片處理功能,引入瞭opencv-2413.jar。除瞭class文件的變化之外,唯一的修改就是MANIFEST.MF文件瞭。分析來看,問題很可能就出在這個文件上,將該文件還原,果然,jar至少能啟動瞭。
不就是MANIFEST.MF文件中類路徑新添加瞭一個opencv嗎,為什麼會這樣呢?
MANIFEST.MF是一個非常脆弱的文件,格式要求比較嚴格,一個空格、一個回車符,都可能會導致該文件失效,從而使得對應的jar包非法:Invalid or corrupt jarfile!
MANIFEST.MF格式要求
1. 文件中的內容以key-value鍵值對的形式出現,key和value之間采用”英文冒號+空格”進行分隔,註意:冒號後的空格必須有;key必須頂格寫,之前不能有空格。
2. 文件開頭不能有空行,並且文件總是以Manifest-Version屬性開頭。
3. 文件必須以一個空行結束,註意:該空行不能有任何字符,包括空格。
4. 每行最長72個字符,如果超過的話,采用續行,換行繼續必須以空格開頭。
5. 對於Class-Path屬性中的存在的路徑,使用”/”分隔目錄,與平臺無關;多個jar包引用以空格分開。
針對MANIFEST.MF文件每行不能超過72個字符的說法,還有疑問。因為我的MANIFEST.MF文件中,Class-Path屬性的很多行都是超過72個字符的,實際上並沒有引起異常。
我的jar包之所以報錯,就是違背瞭以上的第3條,文件雖然以空行結束,但該空行隱藏瞭一個空格,也就是上圖中的第14行包含瞭一個空格。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- VisualStudio2019配置OpenCV4.5.0的方法示例
- Java 中 Class Path 和 Package的使用詳解
- Python下opencv庫的安裝過程及問題匯總
- maven為MANIFEST.MF文件添加內容的方法
- C++中opencv4.1.0環境配置的詳細過程