今天想用以前搭建好了的一个简洁版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版本的方法
感谢这位大哥http://blog.sina.com.cn/s/blog_7725bc930100sk9c.html
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后就再也没有出现这种情况了
而之前时行时不行的原因我认为就是1所说的网络问题,当本地找不到合适的xsd的时候,它会自动上网去找,只要网络正常就没问题,否则就会出现上述的错误。
而由于我这边或spring网络坑爹的原因,造成了时行时不行的神效果(要不要每次都在我修改后就出问题那么准时啊)