Unable to locate Spring NamespaceHandler for XML schema namespace

今天在测试程序的时候发现一个诡异的spring异常,此异常在IDE调试中不存在,但在测试环境中打包后即出现,错误日志如下

异常分析

从字面上看在classpath中找不到关于spring-tx的定义,检查了lib与applicationContext.xml也是正常的,毕竟在IDE中运行是正确的.随后将测试环境中的jar包解压下来检查.发现在jar包中META-INF中有多个spring.handlers,spring.schemas,spring.tooling文件,并且每个文件中的内容均不一样.
此时,我怀疑是ant打包的问题,spring的头文件定义在META-INF中,但每个spring包的META-INF定义文件名一样,而ant在打包的时候并没有将这些文件进行合并,导致在jar中出现多个同名文件,但这些文件在读取的时候就会出现被覆盖的现象,也就出现文章开始时出现的异常.

解决方案

既然问题是META-INF,那么我们只需要重新将META-INF进行打包即可,我们将全部spring所需要的META-INF重新定义,打成spring-meta.jar,同时将此文件加入至项目中的classpath下,同时在build.xml文件中加入spring-meta.jar,并且要保证此文件在spring lib后加载即可.最后重新打包发布,然后查看新的jar包META-INF中spring定义,所需要的namespace定义已经在此文件中,启动程序,正常运行.

发表评论(已有 2 条评论)

设置头像

*

  1. maoer1992 说:

    “我们将全部spring所需要的META-INF重新定义,打成spring-meta.jar” 请问这句怎么操作呢?求解答

    • 阿土笨笨 说:

      呵呵,最简单的办法就是用zip将这几个文件打包,然后改后缀,当然你也可以用jar命令打~