Spring加载xsd引起的问题小记
前言
最近要把之前写好的监控系统加上报警功能,就是通过rpc调用发短信发邮件的服务发送报警信息。发短信发邮件的功能是通过dubbo管理提供的。自然使用这些服务就难免用到spring。而我这又是一个storm工程,为了方便,我都是用maven-shade-plugin把所有依赖的jar打到一起。
在本地运行没有任何问题,但已提交到在线环境的storm(在线环境是没法连接到外网的),就会报错:
spring cvc-elt.1: Cannot find the declaration of element 'beans'
对于这个错误,网上有很多解决方法,其本质就是找不到对应的xsd文件。但好多解决方法都是碰巧并不是对问题本质有了了解后的解决方式。所以我在这里记录下自己的解决方式。
spring加载xsd文件的流程
要解决上述问题,就需要理解spring加载xsd文件的流程:
1、spring首先会读取spring jar包下META-INF下的spring.schemas,根据spring.schemas里的映射路径在本地找xsd文件。
2、如果在本地找不到xsd文件,spring会通过配置文件里的url到官网上下载xsd文件。
发生问题的原因
通过上述加载xsd的流程,已改可以预见发生问题的原因:
1、在不能访问外网的情况下,使用的xsd的版本高于使用的spring的版本,spring jar包里没有对应版本的xsd导致
2、在不能访问外网的情况下,jar包的META-INF目录下的spring.schemas被破坏,没法找到xsd的映射路径
知道了上述这些之后,我打开了我用maven-shade-plugin打好的jar包,找到META-INF下的spring.schemas,发下里边的映射路径果然不全。掐指一算就知道是maven-shade-plugin打包的问题,它没有将各个jar包里的spring.schemas内容合并到一起,而是采用了覆盖的方式。知道了这个原因后,在maven-shade-plugin里配置如下:
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
然后就这样完美解决了。
据说使用maven-assembly-plugin打包也会出现此问题,所以要当心了
Spring加载xsd引起的问题小记的更多相关文章
- Spring加载xsd文件报错:because 1) could not find the document; 2) the document could not be read...
		
Spring启动时加载xml文件的过程: spring在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件),如果没有找到,才会转向去URL指定的路 ...
 - Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)
		
今天配置Spring的xml出现了错误 Multiple annotations found at this line: - schema_reference.4: Failed to read sc ...
 - 监听spring加载完成后事件
		
有这个想法是在很早以前了,那时的我没有接触什么缓存技术,只知道hibernate有个二级缓存.没有用过memcache,也没有使用过redis. 只懂得将数据放到数组里或者集合里,一直不去销毁它(只有 ...
 - spring加载jar包中多个配置文件(转)
		
转自:http://evan0625.iteye.com/blog/1598366 在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <co ...
 - Dubbo实践(六)Spring加载Bean流程
		
根据上一小节对于spring扩展schema的介绍,大概可以猜到dubbo中相关的内容是如何实现的. 再来回顾Dubbo实践(一)中定义的dubbo-provider.xml: <?xml ve ...
 - 【Spring 源码】Spring 加载资源并装配对象的过程(XmlBeanDefinitionReader)
		
Spring 加载资源并装配对象过程 在Spring中对XML配置文件的解析从3.1版本开始不再推荐使用XmlBeanFactory而是使用XmlBeanDefinitionReader. Class ...
 - spring加载配置文件
		
spring加载配置文件 1.把applicationContext.xml直接放在WEB-INF/classes下,spring会采用默认的加载方式2.采用在web.xml中配置ContextLoa ...
 - spring加载资源文件中classpath*与classpath的区别
		
在spring和MyBatis继承的时候,配置mapperLocations.一开始配置是这样的. 需要加载路径为com/thomas/base/mapper和com/thomas/bu/mapper ...
 - Spring加载流程源码分析03【refresh】
		
前面两篇文章分析了super(this)和setConfigLocations(configLocations)的源代码,本文来分析下refresh的源码, Spring加载流程源码分析01[su ...
 
随机推荐
- 关于ScrollView嵌套ListView问题
			
Android开发之ScrollView中嵌套ListView的解决方案 原文:http://blog.csdn.net/minimicall/article/details/40983331 ...
 - angularjs  自定义服务的三种方式
			
angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...
 - sass学习总结
			
SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.个人简单总结了下比较常用的的一些东西. $ 开头定义变量名 是个全局变量 在{ $ ...
 - 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法
			
正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 例如:一个android程序包含两个Activity,分别为MainActivity和Other ...
 - Mysql修改root密码
			
一.启动命令行,输入: taskkill /f /im mysqld.exe //关闭mysql 二.转入mysql的bin目录下 三.输入:mysqld --skip-grant-tables // ...
 - Android 知识杂记(MVP模式)
			
MVP的模式在于将原来activity中业务逻辑的部分剥离出来,代码示例如下: Account public class Account { private String mUsername; pri ...
 - 剑指Offer面试题:10.数值的整数次方
			
一.题目:数值的整数次方 题目:实现函数double Power(doublebase, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 在.N ...
 - UWP开发之控件:用WebView做聊天框
			
目录 说明 WebView存在的价值 使用WebView的几个重要技巧 使用WebView做的聊天框 说明 大家都知道,无论是之前的Winform.WPF还是现在的IOS.Android开发中,都存在 ...
 - Redis系列(六)-SortedSets设计技巧
			
阅读目录: 介绍 Score占位 更多位信息 总结 介绍 Redis Sorted Sets是类似Redis Sets数据结构,不允许重复项的String集合.不同的是Sorted Sets中的每个成 ...
 - [每日电路图] 10、两种MOS管的典型开关电路
			
下图是两种MOS管的典型应用:其中第一种NMOS管为高电平导通,低电平截断,Drain端接后面电路的接地端:第二种为PMOS管典型开关电路,为高电平断开,低电平导通,Drain端接后面电路的VCC端. ...