專案打包成 JAR 後,new File("src/user.xml") 失效——JAR 不是目錄,無法用文件路徑定位內部資源。錯誤代碼如下:
Document doc = new SAXReader().read(new File("src/user.xml")); // 僅開發環境有效
類加載器在載入類時已記錄 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();
}
}
Class.getResourceAsStream() 委託給 ClassLoader;InputStream,dom4j SAXReader.read(InputStream) 直接解析,無臨時文件開銷。/user.xml 表示 classpath 根;user.xml(無斜槓)表示當前類包目錄下;src/main/resources,打包後自動進入 JAR 根目錄;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 開發者從「能跑通」進階到「懂原理」的必經之路。