Spring加载xsd引起的问题小记
2015-06-19 12:12
381 查看
前言
最近要把之前写好的监控系统加上报警功能,就是通过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打包也会出现此问题,所以要当心了
相关文章推荐
- java jxl导出EXCEL
- java判断文件夹是否为空
- java基础入门-iterator迭代器与集合下标的使用
- java基础入门-iterator迭代器与集合下标的使用
- Struts2 Interview Questions and Answers
- jdk:ArrayList
- java jxl 导入EXCEL操作
- jdk Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
- java 判断请求来自手机或电脑
- Java-马士兵设计模式学习笔记-观察者模式-OOD 线程 改进
- Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
- 在Visual Studio和MyEclipse中建立UML图
- struts2的拦截器AbstractInterceptor
- 1小时 1分钟之前 java 处理
- java.util.Scanner的使用
- eclipse中文字体大小修改,让中英文字体协调
- Java 语言特点
- java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
- eclipse配置自动生成ndk javah文件
- java中使用list.remove需要注意的问题