在一些大型項目中,項目所依賴的庫可能比較到,有時候也會出現庫沖突的情況,曾經遇到過一種情況:一個第三方雲存儲提供了一個sdk,這個sdk本身依賴httpclient相關的包,然而對方卻把httpclient包中的部分代碼復制到了sdk中,當項目中使用的httpclient版本與sdk中的版本一致時,沒有任何問題,然而,當更新httpclient 至新版本的時候,問題出現了,出現了沖突,檢查項目中使用的httpclient版本代碼,沒有任何問題,但是就是運行時報錯,非常難以調試,甚至無法調試,這個時候,我們通常可以通過查找運行時出現沖突的地方時來自哪個jar包,java本身也有自帶工具檢查,簡單代碼如下:
public static void main(String[] args) throws Exception { ProtectionDomain pd = ContentType.class.getProtectionDomain(); CodeSource cs = pd.getCodeSource(); System.out.println(cs.getLocation()); }
運行結果可以看到:file:/D:/dev/m2/org/apache/httpcomponents/httpcore/4.4.1/httpcore-4.4.1.jar
但是,如果查看jdk中的類的時候,會出現空指針NPE異常:
public static void main(String[] args) throws Exception { ProtectionDomain pd1 = List.class.getProtectionDomain(); CodeSource cs1 = pd1.getCodeSource(); System.out.println(cs1.getLocation()); }
CodeSource 為null, 有時候也可以使用-verbose來查看系統類的裝載信息。