2012-10-15 138 views
54

我試圖在Spring中創建第一個bean,但加載上下文時出現問題。 我有一個在src/main/resources中的bean的配置XML文件。當Spring確實存在時,找不到bean xml配置文件

我收到以下IOException異常:

在線程異常 「主要」 org.springframework.beans.factory.BeanDefinitionStoreException:IOException異常從類路徑資源解析XML文件[來源/主/​​資源/的beans.xml ]。嵌套的例外是

java.io.FileNotFoundException:類路徑的資源[來源/主/​​資源/ beans.xml文件]不能 打開,因爲它不存在

,但我不明白這一點,因爲我做了下面的代碼測試:

File f = new File("src/main/resources/beans.xml"); 
System.out.println("Exist test: " + f.exists()); 

這給了我真實的! resources位於類路徑中。怎麼了?

+0

如何加載上下文? –

回答

109

謝謝,但那不是解決方案。我發現它爲什麼不適合我。

因爲我已經做了聲明:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

我想我應該指的是項目的根目錄時beans.xml的文件在那裏。 後來我把配置文件爲src /主/資源,改變初始化:

ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml"); 

它仍然是一個IO異常。

然後將文件留在的src /主/資源/但我改變聲明:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

,它解決了這個問題 - 也許這將是對別人有幫助的。

感謝和歡呼!

編輯:

因爲我得到很多人豎起大拇指的解決方案,並已數年前曾與Spring首先體驗的學生,我感到慾望在短期內解釋爲什麼它的工作原理。

當項目正在編譯和打包時,項目中'src/main/java'的所有文件和子目錄都會轉到打包jar(我們要創建的工件)的根目錄。同樣的規則適用於'src/main/resources'。

這是一個在構建項目過程中被許多工具(如maven或sbt)所尊重的約定(注意:作爲默認配置!)。當代碼(來自帖子)處於運行模式時,由於beans.xml位於jar的根目錄中,因此找不到「src/main/resources/beans.xml」(複製到/ beans .xml創建的jar/ear/war)。

當使用ClassPathXmlApplicationContext時,適用於bean xml定義的位置聲明(在本例中爲「/beans.xml」),因爲這是它在jar中的路徑,後來在classpath中。

它可以通過解壓一個jar包與一個存檔器(即rar)並查看它的內容與目錄結構進行驗證。

我會推薦閱讀關於classpath的文章作爲補充。

+0

我無法看到ApplicationContext context = new ClassPathXmlApplicationContext(「beans.xml」);'ApplicationContext context = new ClassPathXmlApplicationContext(「beans.xml」);' –

+1

@FlorianF沒有區別。不同之處在於放置文件的位置,文章中描述的內容。 – dawrutowicz

+2

我看到你將'beans.xml'更改爲'src/main/resources/beans.xml',然後*返回* beans.xml。謝謝。 –

2

你已經看過src目錄。 xml文件確實存在於那裏。但是看看你的所有輸出類都在哪裏設置了class或bin/build目錄。我懷疑你只需要resources/beans.xml路徑來使用。

41

試試這個:

new ClassPathXmlApplicationContext("file:src/main/resources/beans.xml");

文件: preffix點文件系統資源,而不是類路徑。

文件路徑可以是相對或系統(/家/用戶/工作/ src目錄...)

+1

好吧,最好保留classpath中的資源而不是硬編碼,但是謝謝。我那時沒有經歷過CP :-) – dawrutowicz

+1

使用[FileSystemXmlApplicationContext]可能更好(https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/支持/ FileSystemXmlApplicationContext.html)文件。 – romnempire

+0

我有類似的問題,這種解決方案爲我工作。 – Avdhut

15

我也有過類似的問題,但因爲有點不同的原因,以便分享此情況下,它可以幫助任何人。

我的文件位置

beans.xml file

我是如何使用

ClassPathXmlApplicationContext("beans.xml");

有兩個解決方案

  1. 將beans.xml取出包並放入默認包中。
  2. 使用它時指定軟件包名稱即viz。

ClassPathXmlApplicationContext("com/mypackage/beans.xml");

+1

好,真的有待說。參考「com/mypackage/beans.xml」與「/com/mypackage/beans.xml」相同,因爲「com/mypackage/beans.xml」是使用「/」(根)建立絕對路徑的相關路徑。 – dawrutowicz

+0

這只是我的工作解決方案。謝謝! – Firzen

0

我做的大部分是相反的。我正在使用Force IDE Luna Java EE,並且將我的Beans.xml文件放在包中;但是,我在Beans.xml字符串前面加上了相對路徑 - 用於ClassPathXMLApplicationContext參數。所以在我的主要應用 - 它訪問的beans.xml文件中的一個 - 我有:

ApplicationContext context = 
     new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml"); 

我也注意到,當我移動的beans.xml文件到包從src文件夾,有一個位於XML文件圖標左下角的Bean圖像,當此xml文件位於包外時,該圖像不存在。這是讓我知道現在可以通過ClassPathXMLAppllicationsContext訪問beans xml文件的一個很好的指示器。

3

使用它 ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

0

這是對我工作:

new ClassPathXmlApplicationContext("classpath:beans.xml"); 
+0

嗨,這工作對我來說,但問題是當jar文件構建的jar沒有運行我..我的意思是,我得到NoClassDefFoundError,而我嘗試運行的jar文件,當我運行應用程序Eclipse作爲Java運行沒有錯誤,不知道如何解決這個問題 – sailaja

1

注意第一個ApplicationContext已加載的web.xml一部分;這在下面提到。

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>META-INF/spring/applicationContext.xml</param-value> 
</context-param> 

<servlet> 
    <servlet-name>myOwn-controller</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>META-INF/spring/applicationContext.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

下面的代碼也會嘗試創建一個以上的applicationContext。

private static final ApplicationContext context = 
       new ClassPathXmlApplicationContext("beans.xml"); 

differencebeans.xmlapplicationContext.xml 如果appliationContext.xml<META-INF/spring/>之間

,並與<import resource="beans.xml"/>那麼這個appliationContext.xml被加載beans.xml同一位置的appliationContext.xmlMETA-INF/spring下宣佈。

where as;在代碼中;如果它被宣佈像下面

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

這是在WEB-INF/classes或月食src/main/resources望beans.xml中。

[如果你有src/main/resources那麼它可能在創建WAR被放置在WEB-INF/classes。加入beans.xml]所以完全文件擡頭。

我已經加入classpath中查找在applicationContext.xml進口像下面

<import resource="classpath*:beans.xml" /> 

,同時解決了這個問題,並在Java代碼中刪除的行ClassPathXmlApplicationContext("beans.xml"),所以會有隻有一個ApplicationContext中加載。

4

src/main/resources是一個源代碼目錄,你不應該直接引用它。當您構建/打包項目時,內容將被複制到類路徑的正確位置。然後,您應該加載像這樣

new ClassPathXmlApplicationContext("beans.xml") 

或者這樣

new GenericXmlApplicationContext("classpath:beans.xml"); 
1

在春天所有的源文件的src/main/java的內部。同樣,資源通常保存在src/main/resources中。因此請將您的spring配置文件保存在資源文件夾中

確保您的src/main/resources文件內還有ClassPath條目。

在.classpath中檢查以下兩行。如果他們缺少添加它們。

<classpathentry path="src/main/java" kind="src"/> 
<classpathentry path="src/main/resources" kind="src" /> 

所以,如果你有一切就位,下面的代碼應該工作。

ApplicationContext ctx = new ClassPathXmlApplicationContext(「Spring-Module.xml」);

0

如果這個問題仍然flummoxing你,你正在使用Eclipse開發,看看這個Eclipse的錯誤:Resources files from "src/main/resources" are not correctly included in classpath

解決方案似乎是看項目,Java構建路徑,源文件夾的屬性。刪除/src/main/resources dir並重新添加。這會導致Eclipse被提醒需要將這些文件複製到類路徑中。

當使用Eclipse的「Neon」版本時,此錯誤影響了我。 (直到我意識到剛剛描述的簡單修復程序,我感到非常沮喪)

相關問題