[問題] log4j 無法照路徑載入資源

看板java作者 (全新開始)時間11年前 (2013/10/01 03:31), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串1/1
想請問一下,為什麼在 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
挖~我都放在classpath底下~算有讀到就好~XD
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)
文章代碼(AID): #1IIT6HqP (java)
文章代碼(AID): #1IIT6HqP (java)