zoukankan      html  css  js  c++  java
  • spring xsd

    http://ljhzzyx.blog.163.com/blog/static/3838031220132239471608/

     

    spring配置文件报找不到xsd文件错误  

    2013-03-23 10:06:08|  分类: Spring |  标签:spring  xsd  beans   |举报 |字号 订阅

     
          一个spring项目出现错误
    org.xml.sax.SAXParseException ... Failed to read schema document ... http://www.springframework.org/schema/ejbcontext/spring-ejbcontext.xsd
          正好上面那个url不能访问,就出错了。网上解决方法有,将spring配置文件的xsd修改为本地 classpath:org/springframework.../spring-ejbcontext.xsd。或者host 127.0.0.1 www.springframework.org,然后搭建本地web服务。
          这些解决方法不直接,spring寻找xsd文件不是直接从网上去找的,而是先从本机jar包里找:
    从这里http://blog.csdn.net/bluishglc/article/details/7596118摘录如下
    spring 在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件),如果没有找到,才会转向去URL指定的 路径下载。这是非常合理的做法,并不像看上去的那样,每次都是从站点下载的。事实上,假如你的所有配置是正确定的,你的工程完全可以在断网的情况下启动而 不会报上面的错误。Spring加载xsd文件的类是PluggableSchemaResolver,你可以查看一下它的源码来验证上述说法。另外,你 可以在log4j.xml文件中加入:
    <logger name="org.springframework.beans.factory.xml">  
        <level value="all" />  
    </logger>  
    通过日志了解spring是何加载xsd文件的。
     
    在很多spring的jar包里,在META-INF目录下都有一个spring.schemas,这是一个property文件,其内容类似于下面:
    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  
    ....  
     
    实 际上,这个文件就是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包含了所有出现过的版本的集 合!
     
            依照上面的说法,assembly打包,并且项目为单一包时可能会出现这个问题。这个没有去验证,我一直用assembly插件,很好用的一个插件。我的项目出现这个问题,经检查是因为依赖的spring jar包有多个版本,通过maven配置将低版本的spring包排除就不报错了。

           还有一个错误
    Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class
          也是不同版本jar包冲突引起的,继续排除不需要的jar就解决了。
  • 相关阅读:
    CF91 B. Queue
    CF18 C. Stripe
    CF767 A. Snacktower
    CF349 B. Color the Fence
    CF519 B. A and B and Compilation Errors
    NLog Helpper日志帮助类配置和使用
    一步一步搭建 .net core 应用
    使用webform、websevice来进行ajax请求操作
    各种奇技淫巧-持续更新
    防止表单提交时刷新页面-阻止form表单的默认提交行为
  • 原文地址:https://www.cnblogs.com/jvava/p/4953690.html
Copyright © 2011-2022 走看看