jdk8升级jdk21 cxf报错 踩坑记录

2024-05-09 4634阅读

项目场景:

听说jdk21有很多实用新特性,就想弄个玩玩,闲来无事把公司项目从spring2+jdk1.8直升到spring3+jdk21,折腾两天升级完了,本以为就这么简单结束了。直到把项目发布到服务器测试调用第三方接口,一直报错:jakarta.xml.bind.JAXBException: "com.xx.xx" 不包含 ObjectFactory.class 或 jaxb.index。各种百度,翻看源码,折腾两个星期也未能解决问题,一度想要放弃。

经过这么长时间折腾,我发现在IDEA中调用接口就不会报错,一旦打成jar使用java -jar执行就一定会报错,这一定是jvm环境问题!我用jconsole连接两种不同场景下的jvm,经过自己反复对比调试,终于发现了问题所在。


问题描述

使用cxf创建动态客户端时报错:jakarta.xml.bind.JAXBException: "com.xx.xx" 不包含 ObjectFactory.class 或 jaxb.index

// 创建动态客户端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(addr);
client.invoke(methodName, param);

jdk8升级jdk21 cxf报错 踩坑记录 第1张


原因分析:

从jdk11起移除了jaxb模块,cxf编译动态客户端代码时,默认的classpath为java.class.path,当打包成jar后,java.class.path指定的目录就是当前运行的jar,由于jdk11也移除了rt.jar、tool.jar,cxf编译动态客户端java文件时,会因为找不到依赖的jar包报错。


解决方案:

1. 在jar包同级目录下新建一个libs目录,放入jakarta.xml.bind-api-4.0.2.jar

jdk8升级jdk21 cxf报错 踩坑记录 第2张

jdk8升级jdk21 cxf报错 踩坑记录 第3张

2. 项目启动时,把cxf编译动态客户端所依赖的jar包添加到java.class.path中。

// 获取当前jar所在目录
String jarPath = (System.getProperty("user.dir")).replaceAll("\\", "/").replace("file:/", "/");
String classPath = jarPath + "/libs/jakarta.xml.bind-api-4.0.2.jar";
// 因为从jdk11起移除了jaxb模块,cxf编译动态客户端代码时,默认的classpath为java.class.path,由于jdk11也移除了rt.jar、tool.jar,会导致编译异常,报错:
// jakarta.xml.bind.JAXBException: "com.xx.xx" 不包含 ObjectFactory.class 或 jaxb.index
System.setProperty("java.class.path", System.getProperty("java.class.path") + ";" + classPath + ";");

下面提供一个示例程序,仅供参考。大佬们如果有更好的解决方案,欢迎提出交流。


参考链接:

[CXF-7932] JaxWsDynamicClientFactory in Spring Boot fat JAR with JDK11 leads to JAXBException ... doesnt contain ObjectFactory.class or jaxb.index - ASF JIRA

[CXF-7925] Dynamic WSDL Client creation fails on JDK 11 because it cannot compile generated classes - ASF JIRA

转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_34680736/article/details/137404102


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]