本文原文连接: http://blog.csdn.net/bluishglc/article/details/7596118 ,转载请注明出处!

有时候你会发现过去一直启动正常的系统,某天启动时会报出形如下面的错误:

[plain]  view plain copy
  1. 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文件读取不到了,原因多是因为断网或spring的官网暂时无法连接导致的。 你可以通过在浏览器输入xsd文件的URL,如:http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 进行确认。

关于这个问题,网上有两种常见的解决方法,第一种简单有效,但是工作量大,即:把所有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文件中加入:

[html]  view plain copy
  1. <logger name="org.springframework.beans.factory.xml">
  2. <level value="all" />
  3. </logger>

通过日志了解spring是何加载xsd文件的。

接下来,问题就是为什么spring在本地没有找到需要的文件,不得不转向网站下载。关于这个问题,其实也非常简单。在很多spring的jar包里,在META-INF目录下都有一个spring.schemas,这是一个property文件,其内容类似于下面:

[plain]  view plain copy
  1. http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd
  2. http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd
  3. http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd
  4. ....

实际上,这个文件就是spring关于xsd文件在本地存放路径的映射,spring就是通过这个文件在本地(也就是spring的jar里)查找xsd文件的。那么,查找不到的原因排除URL输入有误之外,可能就是声明的xsd文件版本在本地不存在。一般来说,新版本的spring jar包会将过去所有版本(应该是自2.0以后)的xsd打包,并在spring.schemas文件中加入了对应项,出现问题的情况往往是声明使用了一个高版本的xsd文件,如3.0,但依赖的spring的jar包却是2.5之前的版本,由于2.5版本自然不可能包含3.0的xsd文件,此时就会导致spring去站点下载目标xsd文件,如遇断网或是目标站点不可用,上述问题就发生了。

但是,在实现开发中,出现上述错误的几率并不高,最常见的导致这一问题的原因其实与使用了一个名为“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文件,而不是每次去站点下载,做到这一点就需要你结合上述提及的种种情况对你的工程进行一番检查。

spring加载xsd文件相关推荐

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

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7596118 ,转载请注明出处! 有时候你会发现过去一直启动正常的系统,某天启动时会报出 ...

  2. Spring如何加载XSD文件

    http://blog.csdn.net/bluishglc/article/details/7596118 本文原文连接: http://blog.csdn.net/bluishglc/articl ...

  3. org.xml.sax.SAXParseException: Failed to read schema document错误的完美解决方法 以及 Spring如何加载XSD文件

    有时候你会发现过去一直启动正常的系统,某天启动时会报出形如下面的错误: org.xml.sax.SAXParseException: schema_reference.4: Failed to rea ...

  4. Spring加载properties文件的两种方式

    2019独角兽企业重金招聘Python工程师标准>>> 在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取pro ...

  5. Spring加载xml文件错误异常:Offending resource: class path resource [spring-context.xml];

    很少写单纯的java工程,在运行的时候,加载xml文件的时候报错,在此记录错误信息,备自己以后查阅,错误信息如下: Java HotSpot(TM) 64-Bit Server VM warning: ...

  6. java 加载 xsd文件_Spring中自定义xsd文件操作方式

    1 设置html文件的语法格式xsd文件 根据POJO的属性编写xsd文件. 例如 targetNamespace="http://www.zhangyh.com/schema/user&q ...

  7. spring加载properties文件顺序

    我们在使用spring是,在配置文件中经常需要使用到<context:property-placeholder location="" />标签.这样系统配置就能直接写 ...

  8. spring加载properties文件

    <context:property-placeholder location="classpath:jdbc.properties,classpath:setting.properti ...

  9. Spring加载资源文件的方式

    UrlResource 封装了java.net.URL,它能够被用来访问任何通过URL可以获得的对象,例如:文件.HTTP对象.FTP对象等.所有的URL都有个标准的 String表示,这些标准前缀可 ...

最新文章

  1. 最新版elasticsearch的安装踩坑
  2. 4.Boost之ref
  3. 使用比较器的nulls对具有null值的列表进行排序
  4. 第十二届 蓝桥杯 青少年C++组 10月比赛 第1题
  5. 关于APK文件反编译方法(图文详解)
  6. Codeforces Round #530 (Div. 2)
  7. snmp基本介绍--理解OID/MIB/snmp报文类型/snmp版本
  8. 面试题 04.01. 节点间通路
  9. java在初始化过程_Java初始化和实例化顺序
  10. Python_Python处理JSON文件
  11. hdu 1711 Number Sequence
  12. Opencv3与Opencv2的区别,及opencv2项目移植到opencv3注意事项
  13. SeetaFace人脸识别系统
  14. 高级软件工程课程总结
  15. QQ群排名技术讲解、实战分析、核心要点 盗引结合篇
  16. laravel 阿里云短信验证码
  17. 传统形态抗锯齿 2.0
  18. 无火花工具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. Decorate 模式
  20. MBA-day13数学-年龄问题-应用题

热门文章

  1. HTML——携程旅游案例
  2. Saliency as Evidence: Event Detection with Trigger Saliency Attribution 论文解读
  3. PC机组成——内存储器
  4. cocostudio 1.6
  5. norflash的基本操作2
  6. JAVA 用enum 来枚举java项目中的错误信息
  7. NameNode故障处理方法
  8. IEEE-754例题
  9. 如何加强数字版权保护
  10. 开发转测试,坚持16 年,转型并没错!