异常如图:
平时可以正常运行的springMVC项目,在用maven加入依赖,添加jar包后运行,出现如下异常:
XParseException:schema_reference.4:Failed to read schema document"http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"..r如下:
异常提示:找不到xsd文件,在spring的web.xml文件写好基本配置之后,配置文件《servlet-name》-servlet.xml文件中的beans定义的xsi:schemaLocation为http://www.springframework.org/schema/beans/spring-beans-3.2.xsd,如图:
首先要知道:spring在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件),
在很多spring的jar包里,在MERA-INF目录下都有一个spring.schemas,这是一个property文件,
如图为使用maven配置的spring-beans-3.0.3的jar包下的META-INF目录下的spring.schemas目录;
异常出现的原因:实际上,这个文件就是spring关于xsd文件在本地存放路径的映射,spring就是通过这个在本地查找xsd文件的;在排除URL输入有误之后,声明的xsd文件找不到可能就是在本地不存在。一般来说,新版本的spring jar包会将所有(应该是自x.0以后)的xsd打包,并在spring.schemas文件中加入对应项,出现问题的情况往往是声明使用了一个高版本的xsd文件,如3.0,但当初定义spring的jar包却是2.5之前的版本,由于2.5版本自然不可能包含3.0的xsd文件,此时就会导致spring去站点下载目标xsd文件。
如遇断网或是目标站点不可用,上述问题就会发生。
解决方法:在实际开发中,最常导致这一问题的原因其实遇使用了maven的一个“assembly”的打包插件有关;荐使用另一款打包插件“shade”;因为assembly在对项目进行打包时,只能讲一个版本的jar包下的spring.schemas文件放入最终打出的jar包里,而以前版本的xsd文件就会丢掉,导致文件找不到;;;而shade插件在打包的同时不会抛弃以前的spring.schemas文件,而是把他们进行合并,并最终生成单一的jar包,所以spring.schemas包含了所有
出现过得版本的集合!
具体在pom.xml文件中添加maven-shade-plugin插件的步骤,见网址:http://chenzhou123520.iteye.com/blog/1706242,有详细说明。
另外,相关的解决方法见网址