从WAS7升级到WAS9后WAR运行ClassCastException修复方案
解决WAS9升级后Axis1.0 WS Client的ClassCastException问题
这个问题的核心是WAS9自带的IBM WebServices引擎与你WAR包中Axis1.0/SAJ类的加载冲突——即便你设置了JVM参数指定SAJ实现,WAS默认的parent first类加载策略还是会优先加载IBM的SOAP相关类,导致类型转换失败。下面是具体的解决步骤:
1. 调整WAS类加载策略为Parent Last
这是最关键的一步,强制WAS优先加载WAR包内的类,而非服务器自带类:
- 登录WAS控制台,找到你的应用程序,进入应用程序 > 企业应用程序 > [你的应用] > 类加载和更新检测
- 将类加载器顺序设置为
Classes loaded with local class loader first (parent last) - 如果你的应用是EAR包,还需要设置WAR类加载器策略为
Single class loader for application(确保WAR内的类能被优先加载)
2. 禁用WAS自带的JAX-WS引擎
在你的WAR包的WEB-INF目录下创建或修改ibm-web-ext.xml文件,添加以下配置,强制WAS使用你WAR内的Axis实现:
<?xml version="1.0" encoding="UTF-8"?> <web-ext xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd" version="1.0"> <disableIBMJAXWSEngine>true</disableIBMJAXWSEngine> </web-ext>
3. 验证WAR包依赖完整性
确保你的WAR包的WEB-INF/lib目录包含完整的Axis1.0依赖JAR,包括:
axis.jarsaaj.jarcommons-discovery.jarcommons-logging.jar
同时清理掉WAR包中可能存在的与WAS冲突的IBM相关JAR(比如com.ibm.ws.webservices*.jar这类,不要打包进WAR)
4. 验证JVM参数的正确应用
你设置的SAJ相关JVM参数需要确保在WAS中生效:
- 在WAS控制台进入服务器 > 服务器类型 > WebSphere应用服务器 > [你的服务器] > Java和进程管理 > 进程定义 > Java虚拟机 > 自定义属性
- 添加你之前的那几个参数,确保它们被服务器正确加载,而不是通过外部启动脚本添加(避免参数被WAS覆盖)
5. 长期解决方案:升级Axis版本
Axis1.0是非常老旧的版本(2004年左右),与WAS9的Java 8环境兼容性有限。建议你升级到Axis 1.4(稳定版,兼容Java8),重新生成WS Client代码,这样能从根源减少兼容性问题。
补充验证
修改配置后,重启WAS服务器,测试调用。如果还是出现错误,可以启用WAS的类加载跟踪日志,确认你的SAJ类(com.sun.xml.internal.messaging.saaj.*)是否被优先加载,而不是IBM的com.ibm.ws.webservices.*类。
内容的提问来源于stack exchange,提问作者ScrappyDev
相关产品推荐
相关产品推荐

