Websphere 7小版本不同导致的JAXP兼容性问题

Websphere 7小版本不同导致的JAXP兼容性问题

 

Java, javaEE,  web,  xml,  Xerces,  Websphere, 应用服务器, JAXP

 

         开发JAVAEE 应用的技术人员或多或少都遇见过不兼容的问题,总结一下,最容易出现兼容性的无非是日志(common logging, LOG4J)和XML解析(JAXP/Xerces),因为这两个组件太常用以至于几乎所有的企业级组件都会直接或间接的依赖它们,当我们的WEB应用依赖的东西太多时,不可避免出现兼容性问题。很多WEB应用可以正常在TOMCATJBOSS上跑,可一上WAS就不能用了,其原因,大多是因为类路径中存在不同版本的依赖项,而不同组件依赖的又是不同版本,导致问题。下面我简单说一下最近同事出现一起兼容性问题的解决过程,供大家在解决同类问题时提供一些思路:

 

现象:同样的应用,WAR包未做更改,在WAS7.0.0.9上可以运行正常,但在7.0.0.12上运导致应用启动有错,异常原因是某个JAXP的某个类(好象是Node)缺少某个方法定义。

 

疑问的地方:WAS的小版本的升级也会导致不兼容,这在以前确实没有见过,以前在将TOMCAT应用移植到WAS时,由于WAS也提供了JAXP的相关包,但该包版本太低导致不兼容,当初是通过更改IBM JRE下面的jaxp.properties来解决,JAXP实现更改为我们需要的实现,但这次更改该文件不管事,还是出现同样的错误

 

怀疑点:还是怀疑生产环境里存在两个版本不同的JAXP,但即然已经指定了实现,为什么还会出问题呢?况且WAS的版本只有一些小变化,为什么会出现这么大的问题呢?另外一点,WAS是刚装的,并未对其做什么更改,最终将怀疑点锁定在我们提供的WAR包上。

 

过程:在开发环境寻找出现问题的类,果然找到两个版本的JAXP,其中一个有那个接口,一个没那个接口,它们分别名字:xml-apis.jar, xmlAPIS.jar,但实际都是JAXP接口包,这是开发人员由于引入第三方组件自动通过MAVEN加上去的。去掉低版本的包,再部署,问题得到解决。

 

后续:如果去掉该包导致第三方其它组件有问题,那没办法,只能更换那个第三方组件的版本,让它兼容我们现在的JAXP

 

原来:当类路径中存在多个版本的类时,先加载哪个类是不可预测的,对于不同的JRE,文件结构等都有可能不一样,在本案中,7.0.0.9上加载了高版本的类,而在7.0.0.12上却加载了低版本的类,所以导致问题。

你可能感兴趣的:(java/j2ee,java开源,JAVA应用服务器,websphere,javaee,应用服务器,log4j,tomcat,logging)