[問題] log4j 無法照路徑載入資源
想請問一下,為什麼在 eclipse 內部一樣使用
Thread.currentThread().getClassLoader().getResourceAsStream() 載入資源,
自己寫的程式可以成功載入檔案F,但是程式裡面所呼叫的函式庫,卻無法讀取F呢?
狀況是這樣的,我在 eclipse 裡面開一個專案練習使用 log4j 1.2,
log4j 的函式庫 .jar 放在專案 workspace 外面的資料夾裡,
在專案的 buildpath 設定裡面以 user lib 的方式載入。
Log4j官網上會教我們用 PropertyConfigurator.configure(String str) 載入設定檔
在我練習的專案裡面,寫下上面這行程式碼的類別 HelloLog4j.class
在package test.fileAppender裡面,設定檔 log4j.properties
與 HelloLog4j.class 在相同實體目錄裡面。
但是當我餵 "test/fileAppender/log4j.properties" 字串 StrA
或是 "./test/fileAppender/log4j.properties" 字串 StrB
給 PropertyConfigurator.configure() 方法,都會丟出 FileNotFoundException。
這我就覺得奇怪了,查詢 Log4j 官網 FAQ (http://goo.gl/ijvqoe),
發現它是以 Thread.currentThread().getClassLoader().getResourceAsStream()
載入設定檔的....
但是自己實驗後,發現如果自行在 HelloLog4j.class 調用以上載入檔案的方法,
先建立 Property 類別的實例再丟給 PropertyConfigurator.configure(),
那麼不管載入檔案的路徑參數是 StrA 或 StrB ,都能正常讀入 Log4j.properties,
但 Log4j 函式庫卻無法只靠路徑字串就讀取到設定檔....
為什麼一樣使用
Thread.currentThread().getClassLoader().getResourceAsStream() 載入資源,
自己寫的程式可以成功載入,但是程式裡面所呼叫的函式庫,卻無法呢?
我翻找到 eclipse 的 FAQ (http://goo.gl/zk0ayd)
推測有可能是因為 eclipse 使用不同的 ClassLoader 載入專案的函式庫,
以致於 classpath 不同,但我不知道自己想法對不對呢?
請問有人可以解惑一下嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.76.91
此問題已解決,官網沒改害我浪費兩天懷疑自己是否觀念有錯 QQ
查看原始碼發現 Log4j 的 PropertyConfigurator(String str)
根本就不是用 ClassLoader 載入檔案的,而是使用 FileInputStream 讀檔,
它直接把 str 當成建構式的參數拿去建構 FileInputStream 的實例。
這個 str 必須是系統絕對路徑才能正常讀檔,難怪在專案裡面參數怎麼給都讀不到,
我錯怪 eclipse 了 QQ
→
10/01 09:20, , 1F
10/01 09:20, 1F
推
10/01 19:29, , 2F
10/01 19:29, 2F
的確是可以設定工作目錄讓FileInputStream讀到,
但重點是官網說明沒講清楚,欺騙我的感情。
明明實作是直接拿 str 建構 FileInputStream,講的卻是用 ClassLoader 載入
這樣設定的方法就完全不同啊~
※ 編輯: dream1124 來自: 118.168.95.2 (10/01 21:38)
java 近期熱門文章
PTT數位生活區 即時熱門文章