首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

dom4j 讀取 JAR 包內嵌 XML 資源的正確姿勢

     編輯:Java 相關知識

問題背景

專案打包成 JAR 後,new File("src/user.xml") 失效——JAR 不是目錄,無法用文件路徑定位內部資源。錯誤代碼如下:

Document doc = new SAXReader().read(new File("src/user.xml")); // 僅開發環境有效

核心解法:ClassLoader.getResourceAsStream

類加載器在載入類時已記錄 JAR 根路徑,利用 getResourceAsStream("/user.xml") 即可跨環境統一訪問:

public void read() {
    try {
        // 關鍵:以 '/' 開頭表示從 classpath 根目錄查找
        InputStream is = this.getClass().getResourceAsStream("/user.xml");
        Document doc = new SAXReader().read(is);

        List<Element> itemList = doc.selectNodes("/ACCESOS/item/SOCIO");
        for (Element element : itemList) {
            System.out.println("NUMERO = " + element.elementText("NUMERO"));
        }
    } catch (DocumentException e) {
        e.printStackTrace();
    }
}

原理深度剖析

  1. Class.getResourceAsStream() 委託給 ClassLoader;
  2. 類加載器知道加載該類的 JAR 包位置,自動在 JAR 內部查找資源;
  3. 返回 InputStream,dom4j SAXReader.read(InputStream) 直接解析,無臨時文件開銷。

常見坑點避雷

  • 路徑前綴:/user.xml 表示 classpath 根;user.xml(無斜槓)表示當前類包目錄下;
  • 多模塊項目:確保 XML 放在 src/main/resources,打包後自動進入 JAR 根目錄;
  • 線程上下文類加載器:若在非應用類加載器線程(如 Tomcat 線程池)中調用,改用 Thread.currentThread().getContextClassLoader().getResourceAsStream()。

擴展:讀取任意包下資源

// 讀取 com/config/mapping.xml
InputStream is = MyClass.class.getResourceAsStream("/com/config/mapping.xml");
// 或
InputStream is = MyClass.class.getClassLoader().getResourceAsStream("com/config/mapping.xml");

掌握 ClassLoader 資源加載機制,是 Java 開發者從「能跑通」進階到「懂原理」的必經之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved