java -cp jar文件順序不一致導致程序無法啓動或報錯

linux環境:
java -cp ./jar1.jar:./jar2.jar:./main.jar com.test.main.Main
java -cp ./main.jar:./jar1.jar:./jar2.jar com.test.main.Main

使用java -cp 命令的時候,classloader的加載順序是從前往後的,並且會解析jar文件內的MANIFEST.MF文件內的Class-Path,所以如果具有相同包路徑的class文件,在前面的會生效,後面的不會生效。

main.jar在MANIFEST.MF引用了jar_default.jar
jar1.jar和jar_default.jar都有一個class文件:com.haha.Conflict.class
第一種方式會使用jar1.jar的com.haha.Conflict.class
第二種方式會使用jar_default.jar的com.haha.Conflict.class

很多情況下只有一份業務代碼,即上述樣例中的main.jar,但是因爲認證或者版本或者其它原因,不同的環境需要使用不同的三方包,即上述樣例中的jar1.jar、jar2.jar、jar_default.jar,這時候一般使用java -cp來啓動程序,將我們自己的程序放到最後纔會達到我們期待的效果,否則會失敗。

ps:最近和華爲公司合作,因爲使用了第二種方式導致在服務器啓動一直通不過認證,但是在windows下使用相同命令成功了,是因爲windows下沒有jar_default.jar,所以啓動成功了。經過一番折騰,瞭解java -cp機制後,在服務器使用了第一種方式成功了。

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