java 查看運行時某個類文件所在jar的位置


在一些大型項目中,項目所依賴的庫可能比較到,有時候也會出現庫沖突的情況,曾經遇到過一種情況:一個第三方雲存儲提供了一個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來查看系統類的裝載信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM