本文原文鏈接: http://blog.csdn.net/bluishglc/article/details/7596118 ,轉載請註明出處! web
有時候你會發現過去一直啓動正常的系統,某天啓動時會報出形以下面的錯誤: spring
關於這個問題,網上有兩種常見的解決方法,第一種簡 單有效,可是工做量大,即:把全部spring配置文件中url形式的xsd路徑轉換成指向本地xsd文件的classpath形式的路徑,例 如:classpath:org/springframework/beans/factory/xml/spring-beans-2.5.xsd ,再有一種方法就是在本機搭建web服務器,按URL建立相應文件夾,放入對應xsd文件,在本機hosts文件中加入"127.0.0.1 www.springframework.org".實際上,這兩種方法都屬於「歪打正着」式的方法,直正弄明白這一問題還須要從spring的XSD文 件加載機制談起。 瀏覽器
首先:你必須知道一點:spring在加載xsd文件時老是先試圖在本地查找xsd文件(spring的jar包中已經包含了全部版本的xsd文件),若是沒有找到,纔會轉向去URL指定的路徑下載。這 是很是合理的作法,並不像看上去的那樣,每次都是從站點下載的。事實上,假如你的全部配置是正肯定的,你的工程徹底能夠在斷網的狀況下啓動而不會報上面的 錯誤。Spring加載xsd文件的類是PluggableSchemaResolver,你能夠查看一下它的源碼來驗證上述說法。另外,你能夠在 log4j.xml文件中加入: 服務器
接下來,問題就是爲何spring在本地沒有找到須要的文件,不得不轉向網站下載。關於這個問題,其實也很是簡單。在不少spring的jar包裏,在META-INF目錄下都有一個spring.schemas,這是一個property文件,其內容相似於下面: maven
可是,在實現開發中,出現上述錯誤的概率並不高,最多見的致使這一問題的緣由其實與使用了一個名爲「assembly」 的maven打包插件有關。不少項目須要將工程連同其所依賴的全部jar包打包成一個jar包,maven的assembly插件就是用來完成這個任務 的。可是因爲工程每每依賴不少的jar包,而被依賴的jar又會依賴其餘的jar包,這樣,當工程中依賴到不一樣的版本的spring時,在使用 assembly進行打包時,只能將某一個版本jar包下的spring.schemas文件放入最終打出的jar包裏,這就有可能遺漏了一些版本的 xsd的本地映射,進而出現了文章開始提到的錯誤。若是你的項目是打成單一jar的,你能夠經過檢查最終生成的jar裏的spring.schemas文 件來確認是否是這種狀況。而關於這種狀況,解決的方法通常是推薦使用另一種打包插件shade,它確實是一款比assembly更加優秀的工具,在對spring.schemas文件處理上,shade可以將全部jar裏的spring.schemas文件進行合併,在最終生成的單一jar包裏,spring.schemas包含了全部出現過的版本的集合! 工具
以上就是spring加載XSD文件的機制和出現問題的緣由分析。實際上,咱們應該讓咱們工程在啓動時老是加載本地的xsd文件,而不是每次去站點下載,作到這一點就須要你結合上述說起的種種狀況對你的工程進行一番檢查。