描述:最近做一个项目,具体什么项目就不说了,主要是将项目打成jar包在linux服务器上运行。
现象:jar包打好了,未打包之前项目能在IDE上完美运行。但是打成jar包之后,在linux和本机上报错,错误:unable to load XML
schma......后边还有很多。就是无法加载spring中的xml头中的context的xsd文件。
过程:这个问题整整搞了一天。网上也查了很多资料,将引入的xsd头uri改成相对路径呀、还有什么classpath引入xsd呀、反正能试的都试了,
结果还是报这个错误,当我快要没办法的时候,终于看到曙光了:有兴趣的看看下边这两个URL的人说的,他们说的才算是正解。
http://www.pigg.co/spring-namespace-exception.html
http://code.google.com/p/google-web-toolkit/issues/detail?id=5728
问题正如他们分析的那样,在ant打成jar包的时候,由于把项目中的所有jar包也打进去的,每个jar包下的META-INF下边的spring.handlers、spring.schemas、
spring.tools正是放他们本地xsd文件的引用的地方,由于ant打包,里边jar包一起打,这时候里边的spring的一系列jar包相当于解压了。他们的META-INF文件夹一样,
但是里边的内容就覆盖掉了,导致引用的xsd文件只有最后一个覆盖的jar包的META-INF里边的xsd引用,所以不管你这时候applicationContext.xml再怎么改,打出的jar包
永远会报找不到xsd的schma引用。可能本人表述不是很清楚。具体的可以看给的两个url里边的内容。
解决方法:上边给的两个url里边也给了两个解决方法,实际上只有一个。他们都是同一个解决方法,就是重新打包META-INF,可是这里我确实没瞧出来META-INF还
能怎么打包??我的解决方案是重写spring.handlers、spring.schemas、spring.tools三个文件,将需要的xsd文件全部在相应的jar包里边找到写进去,并覆盖进新打的项目
jar包里边,然后运行,成功。
希望大家有这方面的问题多多交流,这玩意问题网上实在难找啊。