解決運(yùn)行jar包出錯(cuò):ClassNotFoundException問題
Java命令運(yùn)行jar 報(bào)錯(cuò)
運(yùn)行jar命令
java -jar xxx.jar
報(bào)錯(cuò):
Caused by: java.lang.ClassNotFoundException:
原因:要運(yùn)行的jar缺少依賴包
執(zhí)行jar正確命令:
java -Xbootclasspath/a:/home/webuser/gogoal_platform/ggopenapi/lib/snakeyaml.jar -jar xxx.jar
解釋:
-Xbootclasspath
:完全取代系統(tǒng)Java classpath.最好不用。-Xbootclasspath/a
: 在系統(tǒng)class加載后加載。一般用這個(gè)。-Xbootclasspath/p
: 在系統(tǒng)class加載前加載,注意使用,和系統(tǒng)類沖突就不好了.
win32 java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar unix java -Xbootclasspath/a: some.jar:some2.jar: -jar test.jar
win32系統(tǒng)每個(gè)jar用分號(hào)隔開,unix系統(tǒng)下用冒號(hào)隔開
方式二
AppClassloader來加載
這樣就不需要classpath參數(shù)了
我們在MANIFEST.MF中添加如下代碼:
Class-Path: lib/some.jar
lib是和test.jar同目錄的一個(gè)子目錄,test.jar要引用的some.jar包就在這里面。
(這里我剛開始理解成了把lib文件夾也打包進(jìn)test.jar中,實(shí)踐后沒有成功,實(shí)際情況是lib和test.jar,是同一個(gè)目錄一個(gè)層次級(jí)別的)然后測試運(yùn)行,一切正常!
如果有多個(gè)jar包需要引用的情況:
Class-Path: lib/some.jar lib/some2.jar
每個(gè)單獨(dú)的jar用空格隔開就可以了。注意使用相對(duì)路徑。
另:如果META-INF
下包含INDEX.LIST文件的話,可能會(huì)使Class-Path配置失效。INDEX.LIST是Jar打包工具打包時(shí)生成的索引文件,刪除對(duì)運(yùn)行不產(chǎn)生影響。
jar包運(yùn)行報(bào)錯(cuò):Invalid or corrupt jarfile
執(zhí)行:
java -jar xxx.jar
運(yùn)行一個(gè)jar包時(shí),提示報(bào)錯(cuò):
Invalid or corrupt jarfile
該jar之前一直是正常運(yùn)行的,這次只是增加了一項(xiàng)圖片處理功能,引入了opencv-2413.jar。除了class文件的變化之外,唯一的修改就是MANIFEST.MF文件了。分析來看,問題很可能就出在這個(gè)文件上,將該文件還原,果然,jar至少能啟動(dòng)了。
不就是MANIFEST.MF文件中類路徑新添加了一個(gè)opencv嗎,為什么會(huì)這樣呢?
MANIFEST.MF是一個(gè)非常脆弱的文件,格式要求比較嚴(yán)格,一個(gè)空格、一個(gè)回車符,都可能會(huì)導(dǎo)致該文件失效,從而使得對(duì)應(yīng)的jar包非法:Invalid or corrupt jarfile!
MANIFEST.MF格式要求
1. 文件中的內(nèi)容以key-value鍵值對(duì)的形式出現(xiàn),key和value之間采用"英文冒號(hào)+空格"進(jìn)行分隔,注意:冒號(hào)后的空格必須有;key必須頂格寫,之前不能有空格。
2. 文件開頭不能有空行,并且文件總是以Manifest-Version屬性開頭。
3. 文件必須以一個(gè)空行結(jié)束,注意:該空行不能有任何字符,包括空格。
4. 每行最長72個(gè)字符,如果超過的話,采用續(xù)行,換行繼續(xù)必須以空格開頭。
5. 對(duì)于Class-Path屬性中的存在的路徑,使用"/"分隔目錄,與平臺(tái)無關(guān);多個(gè)jar包引用以空格分開。
針對(duì)MANIFEST.MF文件每行不能超過72個(gè)字符的說法,還有疑問。因?yàn)槲业腗ANIFEST.MF文件中,Class-Path屬性的很多行都是超過72個(gè)字符的,實(shí)際上并沒有引起異常。
我的jar包之所以報(bào)錯(cuò),就是違背了以上的第3條,文件雖然以空行結(jié)束,但該空行隱藏了一個(gè)空格,也就是上圖中的第14行包含了一個(gè)空格。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot?HikariCP配置項(xiàng)及源碼解析
這篇文章主要為大家介紹了SpringBoot?HikariCP配置項(xiàng)及源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Mybatis全局配置及映射關(guān)系的實(shí)現(xiàn)
本文主要介紹了Mybatis全局配置及映射關(guān)系的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java實(shí)現(xiàn)鼠標(biāo)拖拽移動(dòng)界面組件
在Java中,F(xiàn)rame或者JFrame自身已經(jīng)實(shí)現(xiàn)了鼠標(biāo)拖拽標(biāo)題欄移動(dòng)窗口的功能。但是Jframe的樣式實(shí)在無法令人滿意,那你又該怎么實(shí)現(xiàn)鼠標(biāo)拖拽移動(dòng)窗口的目的呢?今天我們來探討下2014-09-09java 定時(shí)同步數(shù)據(jù)的任務(wù)優(yōu)化
這篇文章主要介紹了java 定時(shí)同步數(shù)據(jù)的任務(wù)優(yōu)化,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12淺談SpringCloud feign的http請求組件優(yōu)化方案
這篇文章主要介紹了淺談SpringCloud feign的http請求組件優(yōu)化方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02