WAS7迁移至WAS9时CXF WebService部署遇JVMCFRE004验证错误求助
解决WAS 9 + CXF 3.1.11部署时的VerifyError问题
我之前帮团队处理过类似的WAS迁移+CXF版本升级问题,这个VerifyError本质是CXF 3.x的ASM字节码生成和WAS 9的JVM校验、自带组件冲突导致的,给你几个实操性的解决步骤:
1. 禁用WAS自带的JAX-WS组件并调整类加载顺序
WAS 9默认自带JAX-WS实现,会和你打包的CXF 3.1.11产生类冲突。你需要在WAR包的WEB-INF/ibm-web-ext.xml中添加以下配置(如果文件不存在就新建):
<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"> <!-- 关闭WAS自带的JAX-WS支持 --> <enable-jaxws>false</enable-jaxws> <!-- 让应用优先加载自身打包的类,而非WAS父类加载器的类 --> <class-loader delegation="parent-last"/> </web-ext>
2. 统一CXF依赖的ASM版本
CXF 3.1.11依赖ASM 5.x系列,如果你的项目中存在其他依赖引入了旧版ASM(比如Spring的某些老模块),会导致字节码生成异常。用Maven命令排查ASM依赖:
mvn dependency:tree -Dincludes=org.ow2.asm:asm*
然后在pom.xml中排除旧版ASM,手动指定兼容的版本:
<!-- 排除CXF自带的ASM,避免版本冲突 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.11</version> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> </exclusion> </exclusions> </dependency> <!-- 手动添加CXF 3.1.11兼容的ASM版本 --> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>5.2</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> <version>5.2</version> </dependency>
3. 禁用CXF的ASM字节码生成
WAS 9的JVM对字节码校验更严格,CXF默认用ASM生成的jaxws_asm类可能无法通过校验。你可以在Spring配置中强制使用Java反射生成代理:
方式一:针对单个服务配置
<bean id="AccountService" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <!-- 你的服务地址、接口等原有配置 --> <property name="address" value="http://your-service-url"/> <property name="serviceClass" value="com.ao.services.AccountService"/> <!-- 禁用ASM,使用JAX-WS原生代理 --> <property name="disableASM" value="true"/> </bean>
方式二:全局CXF总线配置
<cxf:bus> <cxf:properties> <!-- 全局禁用ASM字节码生成 --> <entry key="disable.asm" value="true"/> </cxf:properties> </cxf:bus>
4. 彻底清理并重新编译打包
即使你用JDK 8编译,旧的编译产物(比如target目录中残留的jaxws_asm类)可能混入了JDK 6的字节码。执行以下命令完全清理并重新打包:
mvn clean install -DskipTests
完成以上步骤后,重新部署WAR包到WAS 9,应该就能解决这个BeanCreationException和VerifyError了。
内容的提问来源于stack exchange,提问作者Ishaq
相关产品推荐
相关产品推荐

