[Fix Bug]Spring 通配符的匹配很全面, 但无法找到元素
问题描述:
今天使用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.csdn.net/article/details?id=52669022 Elastic-Job中常见问题,改文章的第二段,描述了job.xsd在网上是下不到的,在jar中包含
还没有评论,来说两句吧...