Jar 包衝突的解決

2021-07-16 16:01:28 字數 1118 閱讀 2237

1.導致jar包衝突的原因

我們在發布應用的時候,有時能正常啟動,有時卻報nosuchmehodexception、nosuchfieldexception、classnotfoundexception或者nosuchmehoderror、noclassdeffounderror,而發布用的war包卻是同乙個,這是為什麼呢?

原因是因為當專案依賴的jar包很多時,應用載入這些jar包的順序不取決於jvm,而是取決於作業系統,linux環境下就取決於檔案的inode的順序,而不同機器上同乙個jar包的inode值是不一樣的,載入的順序也就不一樣。假如專案依賴a和b;a依賴c1.0,b依賴c2.0,專案在啟動的時候載入哪個版本的c我們是不確定的,這就會導致上述錯誤。

2.解決步驟

2.1 定位衝突的類

根據異常資訊找到對應的類,比如找不到collectionutils.isempty()方法,那衝突的類就是apache的commons-collections中的工具類collectionutils類。

2.2 找出哪幾個jar包中包含該類

使用命令jar -tvf *.jar 檢視包中都有哪些類,tvf的意思是展開而不解壓,方便我們檢視而已;

這樣就可以找到衝突的jar包有哪些。

2.3 分析衝突的jar包的依賴路徑

mvn dependency:tree -dverbose -dincludes=:

mvn dependency:tree是輸出整個應用依賴的jar包,-dverbose是輸出明細,就是輸出所有的引用,包括中間引用。

groupid和artifactid可以選擇乙個,只打出指定groupid和artifactid的依賴關係,這樣打出來的葉子節點就是我們要找的jar包,也可以用

mvn dependency:tree > deptree.txt 打出所有的依賴關係

2.4 選擇乙個所需的版本

在衝突的版本中,我們在自己的專案中用到了哪個版本的語法,就選擇哪個,剩下的就是要將依賴中的不需要的jar包排除

com.***.xx

***x

com.springsource.slf4j.org.apache.commons.logging

org.slf4j

okio的jar包衝突解決

在檔案 opt client flink flink conf flink conf.yaml中配置對映關係 x 執行flink run m yarn cluster ynm test opt client flink flink examples streaming wordcount.jar i...

jar包公升級,jar包衝突

事件 需要將clientlibrary 1.0.jar公升級為clientlibrary 1.1.jar,對jar包版本進行公升級 檢查原因 檢查備份系統可正常訪問,公升級jar包後出現同樣問題,確定jar的問題,getbean name 引用的spring.jar中的org.springframe...

jar包衝突問題

最終解決方案 1 通過檢視錯誤日誌或者錯誤提示,確定問題出現的類,比如 httpservletrequest.x,那麼httpservletrequest可能就是導致問題出現的衝突類。2 查詢所有包含httpservletrequest的jar包 findclass.sh lib httpservl...