日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)...

發(fā)布時(shí)間:2025/7/25 107 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文原文連接:?http://blog.csdn.net/bluishglc/article/details/7596118 ,轉(zhuǎn)載請(qǐng)注明出處!

有時(shí)候你會(huì)發(fā)現(xiàn)過(guò)去一直啟動(dòng)正常的系統(tǒng),某天啟動(dòng)時(shí)會(huì)報(bào)出形如下面的錯(cuò)誤:

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans-2.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

很顯然,spring xml配置文件中指定的xsd文件讀取不到了,原因多是因?yàn)閿嗑W(wǎng)或spring的官網(wǎng)暫時(shí)無(wú)法連接導(dǎo)致的。 你可以通過(guò)在瀏覽器輸入xsd文件的URL,如:http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 進(jìn)行確認(rèn)。


關(guān)于這個(gè)問(wèn)題,網(wǎng)上有兩種常見(jiàn)的解決方法,第一種簡(jiǎn)單有效,但是工作量大,即:把所有spring配置文件中url形式的xsd路徑轉(zhuǎn)換成指向本地xsd文件的classpath形式的路徑,例如:classpath:org/springframework/beans/factory/xml/spring-beans-2.5.xsd ,再有一種方法就是在本機(jī)搭建web服務(wù)器,按URL創(chuàng)建相應(yīng)文件夾,放入對(duì)應(yīng)xsd文件,在本機(jī)hosts文件中加入"127.0.0.1 www.springframework.org".實(shí)際上,這兩種方法都屬于“歪打正著”式的方法,直正弄明白這一問(wèn)題還需要從spring的XSD文件加載機(jī)制談起。

?

首先:你必須知道一點(diǎn):spring在加載xsd文件時(shí)總是先試圖在本地查找xsd文件(spring的jar包中已經(jīng)包含了所有版本的xsd文件),如果沒(méi)有找到,才會(huì)轉(zhuǎn)向去URL指定的路徑下載。這是非常合理的做法,并不像看上去的那樣,每次都是從站點(diǎn)下載的。事實(shí)上,假如你的所有配置是正確定的,你的工程完全可以在斷網(wǎng)的情況下啟動(dòng)而不會(huì)報(bào)上面的錯(cuò)誤。Spring加載xsd文件的類是PluggableSchemaResolver,你可以查看一下它的源碼來(lái)驗(yàn)證上述說(shuō)法。另外,你可以在log4j.xml文件中加入:

<logger name="org.springframework.beans.factory.xml">
<level value="all" />
</logger>

通過(guò)日志了解spring是何加載xsd文件的。


接下來(lái),問(wèn)題就是為什么spring在本地沒(méi)有找到需要的文件,不得不轉(zhuǎn)向網(wǎng)站下載。關(guān)于這個(gè)問(wèn)題,其實(shí)也非常簡(jiǎn)單。在很多spring的jar包里,在META-INF目錄下都有一個(gè)spring.schemas,這是一個(gè)property文件,其內(nèi)容類似于下面:

http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd
....

實(shí)際上,這個(gè)文件就是spring關(guān)于xsd文件在本地存放路徑的映射,spring就是通過(guò)這個(gè)文件在本地(也就是spring的jar里)查找xsd文件的。那么,查找不到的原因排除URL輸入有誤之外,可能就是聲明的xsd文件版本在本地不存在。一般來(lái)說(shuō),新版本的spring jar包會(huì)將過(guò)去所有版本(應(yīng)該是自2.0以后)的xsd打包,并在spring.schemas文件中加入了對(duì)應(yīng)項(xiàng),出現(xiàn)問(wèn)題的情況往往是聲明使用了一個(gè)高版本的xsd文件,如3.0,但依賴的spring的jar包卻是2.5之前的版本,由于2.5版本自然不可能包含3.0的xsd文件,此時(shí)就會(huì)導(dǎo)致spring去站點(diǎn)下載目標(biāo)xsd文件,如遇斷網(wǎng)或是目標(biāo)站點(diǎn)不可用,上述問(wèn)題就發(fā)生了。


但是,在實(shí)現(xiàn)開(kāi)發(fā)中,出現(xiàn)上述錯(cuò)誤的幾率并不高,最常見(jiàn)的導(dǎo)致這一問(wèn)題的原因其實(shí)與使用了一個(gè)名為“assembly”的maven打包插件有關(guān)。很多項(xiàng)目需要將工程連同其所依賴的所有jar包打包成一個(gè)jar包,maven的assembly插件就是用來(lái)完成這個(gè)任務(wù)的。但是由于工程往往依賴很多的jar包,而被依賴的jar又會(huì)依賴其他的jar包,這樣,當(dāng)工程中依賴到不同的版本的spring時(shí),在使用assembly進(jìn)行打包時(shí),只能將某一個(gè)版本jar包下的spring.schemas文件放入最終打出的jar包里,這就有可能遺漏了一些版本的xsd的本地映射,進(jìn)而出現(xiàn)了文章開(kāi)始提到的錯(cuò)誤。如果你的項(xiàng)目是打成單一jar的,你可以通過(guò)檢查最終生成的jar里的spring.schemas文件來(lái)確認(rèn)是不是這種情況。而關(guān)于這種情況,解決的方法一般是推薦使用另外一種打包插件shade,它確實(shí)是一款比assembly更加優(yōu)秀的工具,在對(duì)spring.schemas文件處理上,shade能夠?qū)⑺衘ar里的spring.schemas文件進(jìn)行合并,在最終生成的單一jar包里,spring.schemas包含了所有出現(xiàn)過(guò)的版本的集合!

?

以上就是spring加載XSD文件的機(jī)制和出現(xiàn)問(wèn)題的原因分析。實(shí)際上,我們應(yīng)該讓我們工程在啟動(dòng)時(shí)總是加載本地的xsd文件,而不是每次去站點(diǎn)下載,做到這一點(diǎn)就需要你結(jié)合上述提及的種種情況對(duì)你的工程進(jìn)行一番檢查。
---------------------
作者:bluishglc
來(lái)源:CSDN
原文:https://blog.csdn.net/bluishglc/article/details/7596118
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

轉(zhuǎn)載于:https://www.cnblogs.com/Jeely/p/10812077.html

總結(jié)

以上是生活随笔為你收集整理的Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。