Ant WsImport2执行报java.lang.NoClassDefFoundError问题求助
从错误栈和你的配置来看,核心问题是JAXB与JAX-WS依赖版本不兼容,且缺失了关键的istack-commons-localization组件,导致Ant类加载器无法找到指定类。
问题根源拆解
你提到com.sun.istack.localization.LocalizableMessageFactory$ResourceBundleSupplier在jaxb-impl-2.2.6.jar中,但这个类在JAXB 2.3+版本中已经被拆分到独立的istack-commons-localization jar包中。而你使用的jaxws-tools-2.3.2.jar(JAX-WS 2.3.x)依赖的是这个独立jar的版本,和你当前的jaxb-impl-2.2.6.jar(JAXB 2.2.x)版本不兼容,类结构和路径不匹配,自然会出现找不到类的错误。
具体解决方案
1. 统一JAXB与JAX-WS的版本
JAXB和JAX-WS的版本必须保持对齐,避免跨版本依赖冲突:
- 将
jaxb-impl-2.2.6.jar替换为jaxb-impl-2.3.1.jar(和你已有的jaxb-api-2.3.1.jar版本匹配) - 将
jaxb-xjc-2.2.7.jar替换为jaxb-xjc-2.3.1.jar - 可以选择将
jaxws-tools-2.3.2.jar替换为jaxws-tools-2.3.1.jar,进一步保持版本完全一致
2. 添加缺失的依赖jar
将istack-commons-localization.jar(建议使用2.3.1版本,和JAXB版本匹配)添加到你的extraJars路径中。这个jar是JAX-WS 2.3.x工具类运行时的必需依赖,你之前的依赖列表里完全遗漏了它。
3. 验证类加载情况(可选)
如果还是有问题,可以在wsimport任务中添加verbose="true"参数,查看详细的类加载日志,确认新添加的jar是否被正确加载:
<wsimport wsdl="${build.dir}/src/${wsdl.file}" destdir="build" wsdlLocation="file:/WEB-INF/wsdl/${wsdl.file}" failonerror="true" verbose="true"> <depends dir="${build.dir}/src" includes="*.xsd" /> <produces dir="${lib.dir}" includes="${webservice.name}${webservice.component}WSBeans.jar"/> </wsimport>
总结
本质是跨版本依赖冲突+缺失关键组件,通过统一JAXB/JAX-WS版本并补充istack-commons-localization.jar,就能解决这个NoClassDefFoundError问题。
内容的提问来源于stack exchange,提问作者hell_storm2004

