[Fix Bug]Spring 通配符的匹配很全面, 但无法找到元素

本文解决了一个Spring应用启动时报错的问题,错误提示为“通配符的匹配很全面,但无法找到元素 job:simple 的声明”。通过排查发现是由于Spring未能正确加载ElasticJob的xsd文件导致。

问题描述:

今天使用tomcat启动Spring工程的时候,Spring报错误:"通配符的匹配很全面, 但无法找到元素 job:simple 的声明"。我靠,不是吧,job:simple 明明就在xml文件中,你还找不到,搞什么搞。

问题发现过程:

1 去tomcat的部署目录找一下,xml文件在啊。。。郁闷中。。。

2 后来上网搜索了一下,说是schemaLocation没有配置好。查了一下,配置完好。 纳尼。。。

3 后来看程序的错误日志, Spring去网络上下载xsd。直接访问http://xxx/job.xsd, 果然网上下不到这个xsd。

4 在后来搜到,Spring会在jar包找xsd,最终发现程序的tomcat部署目录中的lib目录下没有elastic-job的jar包。my god!!!

解决办法:

在eclipse中clean一下工程, eclipse自动把jar包部署到程序的运行目录


问题分析: Spring启动时,会使用xsd来校验xml的。如果找不到dtd就会报错。


spring的配置文件上图:

错误指明是1处的错误,其实Spring校验这个xml会使用3处的job.xsd,Spring要找到这个xsd,找不到就报错误了。

Spring的查找xsd的过程: job:simple (图中的1处)-->xmlns:job(图中的2处) --> http://xxx/job.xsd(图中的13处) --> 查找jar包中的xsd(如果没有找到) --> 访问网络下载xsd.


接下来分析http://xxx/job.xsd(图中的13处) --> 查找jar包中的xsd(如果没有找到) --> 访问网络下载xsd. 这个过程。

spring会查找所有的依赖jar包,具体请见下图:


我的工程使用了elastic job 来完成定时任务,其中有个jar包叫elastic-job.spring.jar,spring就是通过他来找到的xsd。

Spring已经知道了http://xxx/job.xsd,会在jar中找"/META-INF/spring-schemas",如图中1处所示,根据该文件内容,可以找到job.xsd了,我的天,Spring终于找到了他的女友job.xsd, 看来和生活中的难度系数差不多啊。


再扩展一下:Spring解析完了我们写的xml后, 如何处理呢?Spring不知道怎么处理,交给jar的开发者处理, 图中的4和5处,就是处理的文件。


参考:

1 http://www.cnblogs.com/zhaoxinshanwei/p/5766231.html     通配符的匹配很全面, 但无法找到元素

2 http://m.blog.youkuaiyun.com/article/details?id=52669022     Elastic-Job中常见问题,改文章的第二段,描述了job.xsd在网上是下不到的,在jar中包含




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值