首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ClassLoader.getResource("/") 返回非 null 的根因:JAR 內空目錄導致

     編輯:程式設計綜合問答

現象描述

專案引入 alipay-sdk-java20150407220053.jar 後,ClassLoader.getResource("/") 竟返回具體路徑而非預期的 null;移除該 JAR 後恢復正常返回 null。

根因分析

經排查,該 JAR 內部包含一個無名稱的空目錄條目(即目錄名為空字串)。ClassLoader 在掃描類路徑根目錄時,檢測到此「根目錄下的空名目錄」,誤判為資源存在而返回路徑。

驗證方法

// 列出 JAR 內所有條目
jar tf alipay-sdk-java20150407220053.jar | grep -E '^/?$'
# 若輸出包含空行或單獨的 "/",即確認存在空目錄條目

影響與建議

  • 此屬 JAR 打包缺陷,不影響正常類加載,但會干擾依賴 getResource("/") 判斷類路徑根目錄的邏輯
  • 建議:
    1. 聯繫 SDK 提供方修復打包腳本
    2. 或自行重新打包 JAR(排除空目錄條目)
    3. 代碼層面避免依賴 getResource("/") 的返回值判斷邏輯,改用明確資源路徑

補充知識

ClassLoader.getResource("")(空字串)與 getResource("/") 行為一致,均用於獲取類路徑根目錄 URL。正常情況下若類路徑根目錄無實際資源,應返回 null。JAR 規範允許目錄條目,但空名目錄屬於非標準產物。

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