Talend启动与twebservice组件报错求助:Apache CXF Jar引发类加载异常
我之前在Talend EE搭配JBoss 4.2.2部署tWebService组件时,踩过完全一样的坑,本质就是CXF Jar包版本冲突+JBoss类加载机制的问题,先把你遇到的错误信息整理出来:
WARN [org.apache.cxf.bus.extension.ExtensionManagerImpl] 通过META-INF/cxf/bus-extensions.xml(路径:jar:file:/data5/TalendEE/jboss-4.2.2.GA/server/default/tmp/deploy/tmp3204124133425837210tem.ear-contents/lib/z.cxf-2.2.5.jar!/META-INF/cxf/bus-extensions.xml)加载Bus扩展已被弃用,请改用META-INF/cxf/bus-extensions.txt。
Caused by: java.lang.ClassNotFoundException: 加载类org.apache.cxf.ws.policy.AssertionBuilderRegistry时出现意外错误,msg=Implementing class
at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:560)
at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:415)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 164 more
Caused by: java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
给你几个亲测有效的解决步骤:
优先解决Jar包冲突(核心问题)
你看到的IncompatibleClassChangeError和ClassNotFoundException,都是因为Talend打包的CXF 2.2.5和JBoss 4.2.2自带的Web服务类库(JBWS底层的CXF相关组件)版本不匹配导致的。
操作步骤:- 打开Talend Studio,找到你的Job的Build Settings -> Dependencies
- 筛选出所有CXF相关的Jar包(比如
cxf-2.2.5.jar、cxf-rt-ws-policy-*.jar等),把它们的Scope设置为provided - 重新打包Job的Ear/War,这样部署到JBoss时就会使用服务器自带的CXF类库,彻底避免版本冲突
处理弃用警告
那个关于bus-extensions.xml的警告是CXF 2.2.x版本的弃用提示,只要解决了上面的Jar包冲突,换成JBoss兼容的CXF版本后,这个警告自然会消失。如果暂时不想调整版本,这个警告本身不影响核心功能,可以先忽略,但还是建议解决版本问题避免后续隐患。调整JBoss类加载优先级(备选方案)
如果上面的方法没生效,可以尝试修改JBoss的类加载规则,让应用优先加载自己的Jar包:- 如果是War包,在
WEB-INF下创建/修改jboss-web.xml,添加以下配置:
<jboss-web> <class-loading> <loader-repository> com.yourcompany:archive=yourapp.war <loader-repository-config>java2ParentDelegation=false</loader-repository-config> </loader-repository> </class-loading> </jboss-web>- 如果是Ear包,修改
META-INF/jboss-app.xml,添加类似的类加载配置
注意:这个设置会关闭双亲委派机制,可能带来其他类加载问题,一定要在测试环境验证后再放到生产环境。
- 如果是War包,在
内容的提问来源于stack exchange,提问作者zeno

