1. 程式人生 > >開發日誌:解決spring版本導致的Cannot find the declaration of element 'beans',檢視jar中的spring的版本

開發日誌:解決spring版本導致的Cannot find the declaration of element 'beans',檢視jar中的spring的版本

今天想用以前搭建好了的一個簡潔版ssh專案做測試,結果出現這個坑爹的錯誤, 解決過程相當曲折坑爹,下面開始介紹(要解決方案的可直接看藍色字型以下的內容)

以前搭建這個專案,運作過程中一直都沒出現這個錯誤,裡面已有對User、Type表的相關操作 

重新載入專案,第一次啟動時正常的,後來加2個新的實體和對映檔案,再啟動的時候就報了下面的錯誤

錯誤資訊

嚴重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 15 in XML document from ServletContext resource [/WEB-INF/applicationContext.xml] is invalid; nested exception isorg.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(

XmlBeanDefinitionReader.java:404)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(

AbstractBeanDefinitionReader.java:143)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)

at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)

at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)

at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)

at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:422)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)

at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)

at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)

at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)

at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)

at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)

at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)

at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)

at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)

at java.util.concurrent.FutureTask.run(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)

Caused by:org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.

at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)

at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)

at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)

... 27 more

因為上一次是正常的,因此我想都沒想就認為是新對映檔案出了問題,但是弄了好久都沒搞定,看了開發文件和網上的資料,也沒發現自己哪裡搞錯了,實在是弄煩了,乾脆把新增的內容都刪掉,享受一回正常的啟動再說發火但是沒想到,再次啟動居然還是報這個錯誤驚恐

於是乎上網去找了一下的cvc-elt.1: Cannot find the declaration of element 'beans'.解決方法

最常見的原因是缺少commons-pool.jar或spring-beans.jar,我看了下專案,當時眼瞎沒有看到commons-pool.jar,很開心地去下載了個commons-pool.jar,直接放到lib中再去啟動Tomcat,專案啟動正常,上http://localhost 訪問成功,登陸訪問資料庫成功

於是乎,重新在專案中新增對映檔案,再次啟動Tomcat:Error  cvc-elt.1: Cannot find the declaration of element 'beans'驚恐

當時的想法是:Tomcat沒更新,於是乎去clean專案,還是報錯,無奈之下,把commons-pool.jar刪掉後再加入,成功。

為了保險起見,再重啟一下Tomcat,問題又出來了,而且刪除再加入的方法也不行。後來乾脆刪掉jar,然後重啟myEclipse,再載入jar,啟動成功鄙視並且新載入的對映也沒問題。

接著繼續去改類、對映,關掉tomcat後再啟動發火問題又來了,難道每次我都要刪了在關IDE再重啟再載入jar嗎?不可能!而且,弱弱的我發現了這個commons-pool.jar已經載入了尷尬,只好繼續問度娘。

在眾多結果中找到兩個很可能的是造成我現在這種情況的:

1 spring官網問題,等官網好了就OK了的,或者修改beans頭

2 IDE作死,重新排版或修改後再更新就可以了

因為第二個比較簡單,因此我先試了第二個方法,修改application.xml  空格,刪除 儲存,不行~~~~~~~~~~~~~由於第一個方法匯入的是spring-beans-2.0xsd,我一直認為自己的是spring 3.0,因此不想做修改

然後在偶然的情況下,修改了次web.xml檔案,居然啟動成功,而且神奇的是,基本上每次不行,只要會去改下web.xml,基本都OK,一次不行來多幾次就可以了。

雖然好像找到解決方案了,但這個不管怎麼想都特別的坑爹,而且有一次,修改了幾次web.xml都不行,還去修改了struts2.xml、application.xml、類檔案~~~~~~~~~感覺很是懊惱,找谷哥去。

谷哥的搜尋的質量感覺高很多,不像度娘經常找到幾年以前的東西,但也沒找到我想要的答案,不過倒是看了幾個修改了beans頭就好的,然後不小心看到spring版本這幾個字。

難道是我的spring版本和beans頭的不匹配?我轉而去搜索了下檢視spring版本的方法

1. struts的版本資訊

檢視 struts.jar\META-INF\MANIFEST.MF
再檢視 Implementation-Version
看後面的數字..
Implementation-Version: 1.2.7


2.Spring的版本資訊
檢視 Spring.jar\META-INF\MANIFEST.MF
Implementation-Version: 2.0.8
Spring-Version: 2.0.8


3.hibernate3的版本資訊
檢視 hibernate3.jar\META-INF\MANIFEST.MF
Hibernate-Version: 3.2.3.ga
Implementation-Version: 3.2.3.ga

我直接解壓了下spring.jar

通過強大的Ctrl+F在這一大串雞腸中找到了我想要的版本號>  <

2.5的版,而我用的是3.0的配置,哭了~~~~~~~~~~(當初下載的時候那標題明明寫著spring3.0啊~~~~~~~)

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context-3.0.xsd
						http://www.springframework.org/schema/tx
						http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
						http://www.springframework.org/schema/aop
						http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
						">


修改相應的beans後就再也沒有出現這種情況了

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context-2.5.xsd
						http://www.springframework.org/schema/tx
						http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
						http://www.springframework.org/schema/aop
						http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
						">


而之前時行時不行的原因我認為就是1所說的網路問題,當本地找不到合適的xsd的時候,它會自動上網去找,只要網路正常就沒問題,否則就會出現上述的錯誤。

而由於我這邊或spring網路坑爹的原因,造成了時行時不行的神效果(要不要每次都在我修改後就出問題那麼準時啊抓狂