Spring 讀取 xml 檔的路徑問題困擾了我很久
測試讀取成功後稍微整理了一下幾個讀取方法
Spring 讀取 ApplicationContext 用甚麼方式?
可以選擇 FileSystemXmlApplicationContext 或是 ClassPathXmlApplicationContext
先介紹我個人認為最簡單的讀取方式...
1.使用 file:
用下面兩種方式都可以讀取的到
ApplicationContext factory
=new ClassPathXmlApplicationContext("file:檔案在硬碟的絕對路徑");
ApplicationContext factory
=new FileSystemXmlApplicationContext("file:檔案在硬碟的絕對路徑");
那絕對路徑從哪找?
用 eclipse 的話直接左鍵點擊你要找的那個檔案
右鍵選 properties 或是直接 Alt + Enter 可看到如下圖
紅字畫起來的就是我們要的
2.使用 classpath:
用 classpath 前綴詞的狀況是要讀取的 xml 檔案放在 eclipse 中 src 底下
先不談 eclipse, 電腦要執行 java 的 class 檔案是從 classpath 下去找的
此時我踩到的雷是, 我直接將 src (上面圖紅線處 ) 當作 classpath 下去找
執行後的 output 都是..
Caused by: java.io.FileNotFoundException: class path resource [ 這裡是你在建立實體物件時放的path ]
cannot be opened because it does not exist
src folder 裡面是放還沒編譯過的 java 檔案
執行時當然不會從 src folder 下去找,
確認下
windows->Preferences-> Java -> Build Path
看到
bin 目錄是 編譯完 class 檔案 output 去的地方, 它的位置就在你的專案資料夾底下
本來我的 code 是寫成
ApplicationContext factory
=new ClassPathXmlApplicationContext("classpath:sC/core/test/sC/core/com/ccc/ggg/cr/hp/applicationContext-myTest-gg.xml");
這個路徑去找實際的 src資料夾 底下找也可以找到 xml 檔案,
但 ClassPathXmlApplication 實際上不是從 src 下去讀的
從 bin資料夾 下去找, xml 檔其實在
test/sC/core/com/ccc/ggg/cr/hp/applicationContext-myTest-gg.xml
先不管為何編譯完會放在這 (前面的 sC/core/ 消失了 )
總之 xml 檔案放在 src 底下, 那要讀取就先從 bin 資料夾找到你的 xml 檔案, 並拿 bin 底下指到 xml 檔案放置的位置路徑讀取
code:
ApplicationContext factory
=new ClassPathXmlApplicationContext("classpath:bin底下指向xml檔案的path, 多少會跟src中指向xml檔案的path雷同");
ApplicationContext factory
=new FileSystemXmlApplicationContext(classpath:bin底下指向xml檔案的path, 多少會跟src中指向xml檔案的path雷同");
3.不加上 file: , classpath: , 直接填入 path
ApplicationContext factory
=new FileSystemXmlApplicationContext("從eclipse中的專案資料夾下去找");
"eclipse中的專案資料夾"就是..
右鍵你的專案名稱, 以下面圖的例子來說就是 TestJava
Location 就是 eclipse 中你的專案資料夾, 預設就是從這裡讀取的
假設一個aaa.xml 放在 E:\fromUSB\TestJava 底下
那就直接
ApplicationContext factory
=new FileSystemXmlApplicationContext("aaa.xml");
就可以讀取到了
至於ClassPathXmlApplicationContext 呢?
預設就是 classpath: 了, 以第二項的例子來說
ApplicationContext factory
=new ClassPathXmlApplicationContext("sC/core/test/sC/core/com/ccc/ggg/cr/hp/applicationContext-myTest-gg.xml");
只是把 classpath: 拿掉, 效果也相同
P.S
看完上面一定會有疑問,
eclipse 編譯完後輸出的 class 檔案放置的路徑怎麼跟在 src 裡面不一樣 ?
FileSystemXmlApplication 是從專案資料夾開始找檔案, 那 Spring 是怎麼定位到 "專案資料夾" ?
總之是會用了, 有空再研究這些議題...
參考資料:
http://blog.sina.com.cn/s/blog_5d9101fd0100cjhz.html
https://blog.csdn.net/iaiti/article/details/52593150
https://caterpillar.gitbooks.io/javase6tutorial/content/c2_2.html