有时候你会发现过去一直启动正常的系统,某天启动时会报出形如下面的错误:
- 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文件中加入:
- <logger name="org.springframework.beans.factory.xml">
- <level value="all" />
- </logger>
通过日志了解spring是何加载xsd文件的。
接下来,问题就是为什么spring在本地没有找到需要的文件,不得不转向网站下载。关于这个问题,其实也非常简单。在很多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包含了所有出现过的版本的集合!
以上就是spring加载XSD文件的机制和出现问题的原因分析。实际上,我们应该让我们工程在启动时总是加载本地的xsd文件,而不是每次去站点下载,做到这一点就需要你结合上述提及的种种情况对你的工程进行一番检查。
copy from : http://blog.csdn.net/mydreamongo/article/details/7739364
相关推荐
Spring加载XSD文件发生错误的解决方法 在使用 Spring 框架时,可能会遇到加载 XSD 文件发生错误的问题,本文将对此问题进行详细的分析和解决。 问题描述 在使用 Spring 框架时,可能会出现 org.xml.sax....
总之,Spring 3.0的XSD文件是理解和配置Spring框架的关键,它们定义了XML配置的结构和语义,使得Spring应用的配置更加规范、易于维护和扩展。在开发过程中,熟悉这些XSD文件能帮助开发者更好地掌握Spring的精髓,...
Spring默认在启动时是要加载XSD文件来验证xml文件的,所以如果有的时候断网了,或者一些开源软件切换域名,那么就很容易碰到应用启动不了。我记得当时Oracle收购Sun公司时,遇到过这个情况。为了防止这种情况,...
Spring默认在启动时是要加载XSD文件来验证xml文件的,所以如果有的时候断网了,或者一些开源软件切换域名,那么就很容易碰到应用启动不了。我记得当时Oracle收购Sun公司时,遇到过这个情况。为了防止这种情况,...
在这个压缩包中,我们很可能是找到了Spring 3.0版本相关的XSD文件集合,这些文件用于构建和解析Spring应用的XML配置。 首先,Spring框架的核心在于依赖注入(Dependency Injection,DI),它允许开发者在运行时将...
在Spring框架中,XSD文件用于定义XML配置文件的结构和规则,确保配置文件的语法正确性,使得Spring容器能够正确解析和加载配置。 描述中的错误 "cvc-complex-type.2.4.a: Invalid content was found starting with ...
在描述中提到的"spring相关的xsd文件"是指Spring框架中用于配置的XML Schema Definition (XSD)文件,它们定义了Spring配置文件的结构和元素。下面将详细介绍这些标签和文件在Spring框架中的作用。 1. `beans`: 这个...
在Spring框架中,加载多个配置文件是常见的需求,特别是在大型项目中,为了保持代码的整洁和模块化,通常会将不同的配置分散到多个文件中。本文将深入探讨如何在Spring中实现这一功能。 首先,Spring提供了多种方式...
### Spring框架中加载多个配置文件的方法 在Spring框架中,加载多个配置文件是常见的需求之一。这不仅可以帮助我们更好地组织代码结构,还可以提高程序的可维护性和可扩展性。本文将详细介绍Spring框架中如何加载多...
`spring-context-4.2.xsd`是Spring 4.2版本的Context模块的XSD文件,它包含了对Spring配置元素和属性的详细定义,使得开发者可以遵循标准编写XML配置,确保语法的正确性。 `spring-context-4.2.xsd`包含了一系列...
- **Location**:输入或选择XSD文件的具体路径,例如:`F:\soft\programmingSoft\Framework\Spring\spring-framework-2.5.6.SEC01-with-dependencies\spring-framework-2.5.6.SEC01\dist\resources\spring-beans-...
`spring-beans-3.1.xsd`还引入了`profile`概念,允许开发者根据不同的环境条件选择加载不同的bean配置,增强了部署的灵活性。例如,可以通过`, test">`来指定在开发或测试环境中使用的bean配置。 在`<bean>`元素中...
Spring的核心之一就是它的XML配置,而Spring-3.0.xsd则是Spring框架3.0版本的XML schema定义文件,它规定了如何在XML配置文件中正确地声明和配置Spring的各种组件。本文将深入探讨Spring-3.0.xsd,了解其结构、元素...
本篇文章将深入探讨如何在Spring中读取不同目录下的配置文件,以及使用`ClassPathXmlApplicationContext`和`FileSystemXmlApplicationContext`这两种不同的上下文环境来加载它们。 首先,让我们了解`...
Spring 配置文件是一个或多个标准的 XML 文档,applicationContext.xml 是 Spring 的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。 在 Spring 配置文件中,主要包含了以下...
现在,当Spring加载`db.properties`时,`EncryptPropertyPlaceholderConfigurer`会自动解密`db.password`,并将其作为安全的密码值传递给应用程序的其他组件。 总之,通过自定义`PropertyPlaceholderConfigurer`...
2. **IDE 未识别 xsd 文件**:部分 IDE 可能默认不会加载或验证 XSD 文件。此时,可以通过 IDE 的设置菜单启用 XSD 文件的支持。 3. **配置文件不被验证**:如果配置文件没有按照预期的方式被验证,检查 `xsi:...
总之,DTD和XSD文件在Java的Spring框架中起到了关键的作用,它们为XML配置文件提供了结构约束和数据验证,保证了配置文件的正确性和一致性。在使用Spring和Spring MVC时,正确引入和引用这些约束文件是构建可维护、...
在SpringMVC中,加载配置Properties文件是应用中常见的需求,用于存储数据库连接信息、系统配置等关键数据。本文将详细介绍几种SpringMVC加载Properties文件的方法。 1. 通过`context:property-placeholder`实现...
Spring也提供了对应的XSD文件,如`spring-beans.xsd`,它们与DTD文件类似,但提供了更强的数据类型检查和更复杂的结构约束。在现代的Spring项目中,使用XSD比DTD更为常见,因为它们支持更多特性,如命名空间、复杂...