IDEA 中讀取不了配置檔案以及ClassPathXmlApplicationContext與FileSystemXmlApplicationContext
阿新 • • 發佈:2019-02-15
在學習Spring的時候(看的《Spring4.x企業應用開發實戰》),書上用的IDE 是 Myeclipse,這裡用的是IDEA。在編譯:
String configPath = "com/baobaotao/advice/beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
提示錯誤
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com /baobaotao/advice/beans.xml]; nested exception is java.io.FileNotFoundException: class path resource [com/baobaotao/advice/beans.xml] cannot be opened because it does not exist
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344)
at org.springframework .beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader .loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:515)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.baobaotao.advice.TestThrowAdvice.main(TestThrowAdvice.java:14)
Caused by: java.io.FileNotFoundException: class path resource [src/main/java/com/baobaotao/advice/beans.xml] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330)
... 13 more
異常說的比較清楚,指定路徑的檔案不存在。怎麼可能不存在呢,這裡用File的輸出流測試,列印到控制檯上沒有問題,說明路徑是沒有問題的。
然後修改成了
String configPath = "src/main/java/com/baobaotao/advice/beans.xml";
ApplicationContext ctx = new FileSystemXmlApplicationContext(configPath);
是可以訪問到的。
ClassPathXmlApplicationContext
ClassPathXmlApplicationContext 預設從類路徑載入配置檔案,在類路徑資料夾下。這裡用的maven的資料夾結構,如下圖:
target資料夾就是存放class類的資料夾問價相應目錄下,並沒有beans.xml檔案。IDEA在原始碼目錄下(src/main/java),只會把.java檔案編譯成.class檔案,存到classes資料夾下,其他的配置檔案是不會做處理的(MyEclipse會把配置檔案複製到相應的包下)。但可以在resources資料夾下,建立相應的包目錄,放到相應的目錄下,IDEA就會將配置檔案,複製到classes資料夾下,也就可以訪問到了。
這裡從類路徑載入檔案只需要寫指定的包路徑以及檔名即可。如:
String configPath = "com/baobaotao/advice/beans.xml";
FileSystemXmlApplicationContext
FileSystemXmlApplicationContext 預設從檔案系統載入配置檔案,可使用相對路徑或者絕對路徑進行訪問,也就理所當然的會訪問到相應的檔案。這裡從檔案系統訪問路徑需要從根路徑開始寫完整檔案相對路徑,也就是從src開始寫,如:
String configPath = "src/main/java/com/baobaotao/advice/beans.xml";