最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于jdk8升級(jí)jdk21 cxf報(bào)錯(cuò)的踩坑記錄

 更新時(shí)間:2024年10月09日 09:14:46   作者:照貓畫狐  
在升級(jí)Java項(xiàng)目時(shí),從JDK1.8和Spring2遷移到JDK21和Spring3后,遇到了JAXBException錯(cuò)誤,原因是從JDK11開始移除了jaxb模塊,而cxf在編譯動(dòng)態(tài)客戶端時(shí)默認(rèn)classpath不包含必要的類,解決方法是在jar包同級(jí)目錄創(chuàng)建libs并添加jakarta.xml.bind-api

項(xiàng)目場(chǎng)景

聽說(shuō)jdk21有很多實(shí)用新特性,就想弄個(gè)玩玩,閑來(lái)無(wú)事把公司項(xiàng)目從spring2+jdk1.8直升到spring3+jdk21,折騰兩天升級(jí)完了,本以為就這么簡(jiǎn)單結(jié)束了。

直到把項(xiàng)目發(fā)布到服務(wù)器測(cè)試調(diào)用第三方接口,一直報(bào)錯(cuò):

jakarta.xml.bind.JAXBException: "com.xx.xx" 不包含 ObjectFactory.class 或 jaxb.index

各種百度,翻看源碼,折騰兩個(gè)星期也未能解決問(wèn)題,一度想要放棄。

經(jīng)過(guò)這么長(zhǎng)時(shí)間折騰,我發(fā)現(xiàn)在IDEA中調(diào)用接口就不會(huì)報(bào)錯(cuò),一旦打成jar使用java -jar執(zhí)行就一定會(huì)報(bào)錯(cuò),這一定是jvm環(huán)境問(wèn)題!

我用jconsole連接兩種不同場(chǎng)景下的jvm,經(jīng)過(guò)自己反復(fù)對(duì)比調(diào)試,終于發(fā)現(xiàn)了問(wèn)題所在。

問(wèn)題描述

使用cxf創(chuàng)建動(dòng)態(tài)客戶端時(shí)報(bào)錯(cuò):

jakarta.xml.bind.JAXBException: "com.xx.xx" 不包含 ObjectFactory.class 或 jaxb.index

// 創(chuàng)建動(dòng)態(tài)客戶端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(addr);
client.invoke(methodName, param);

原因分析

從jdk11起移除了jaxb模塊,cxf編譯動(dòng)態(tài)客戶端代碼時(shí),默認(rèn)的classpath為java.class.path

當(dāng)打包成jar后,java.class.path指定的目錄就是當(dāng)前運(yùn)行的jar

由于jdk11也移除了rt.jar、tool.jar,cxf編譯動(dòng)態(tài)客戶端java文件時(shí),會(huì)因?yàn)檎也坏揭蕾嚨膉ar包報(bào)錯(cuò)

解決方案

1. 在jar包同級(jí)目錄下新建一個(gè)libs目錄,放入jakarta.xml.bind-api-4.0.2.jar

2. 項(xiàng)目啟動(dòng)時(shí),把cxf編譯動(dòng)態(tài)客戶端所依賴的jar包添加到j(luò)ava.class.path中。

// 獲取當(dāng)前jar所在目錄
String jarPath = (System.getProperty("user.dir")).replaceAll("\\\\", "/").replace("file:/", "/");
String classPath = jarPath + "/libs/jakarta.xml.bind-api-4.0.2.jar";

// 因?yàn)閺膉dk11起移除了jaxb模塊,cxf編譯動(dòng)態(tài)客戶端代碼時(shí),默認(rèn)的classpath為java.class.path,由于jdk11也移除了rt.jar、tool.jar,會(huì)導(dǎo)致編譯異常,報(bào)錯(cuò):
// 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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JSON 與對(duì)象、集合之間的轉(zhuǎn)換的示例

    JSON 與對(duì)象、集合之間的轉(zhuǎn)換的示例

    在開發(fā)過(guò)程中,經(jīng)常需要和別的系統(tǒng)交換數(shù)據(jù),數(shù)據(jù)交換的格式有XML、JSON等,JSON作為一個(gè)輕量級(jí)的數(shù)據(jù)格式比xml效率要高,本篇文章主要介紹了JSON 與 對(duì)象 、集合 之間的轉(zhuǎn)換,有興趣的可以了解一下。
    2017-01-01
  • java面向?qū)ο?API(接口)與集合(ArrayList)

    java面向?qū)ο?API(接口)與集合(ArrayList)

    這篇文章主要介紹了Java語(yǔ)言面向?qū)ο蟮腁PI與集合,還是十分不錯(cuò)的,這里給大家分享下,需要的朋友可以參考,希望能夠給你帶來(lái)幫助
    2021-08-08
  • Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法

    Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 教你輕松制作java視頻播放器

    教你輕松制作java視頻播放器

    這篇文章主要為大家詳細(xì)介紹了如何編寫屬于自己的java視頻播放器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java自定義equals產(chǎn)生的問(wèn)題分析

    Java自定義equals產(chǎn)生的問(wèn)題分析

    這篇文章主要介紹了Java自定義equals時(shí)super.equals帶來(lái)的問(wèn)題分析,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路
    2023-01-01
  • 智能手表開發(fā)API接口

    智能手表開發(fā)API接口

    這篇文章主要介紹了智能手表開發(fā)API接口,使用圖靈機(jī)器人平臺(tái)接口實(shí)現(xiàn)天氣預(yù)報(bào),非常簡(jiǎn)單實(shí)用,這里推薦給大家。
    2015-03-03
  • SpringBoot集成JWT實(shí)現(xiàn)token驗(yàn)證的流程

    SpringBoot集成JWT實(shí)現(xiàn)token驗(yàn)證的流程

    Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).這篇文章主要介紹了SpringBoot集成JWT實(shí)現(xiàn)token驗(yàn)證,需要的朋友可以參考下
    2020-01-01
  • Java RabbitMQ高級(jí)特性詳細(xì)分析

    Java RabbitMQ高級(jí)特性詳細(xì)分析

    為了保證消息的可靠性傳輸,包括投遞消息的生產(chǎn)方能投遞成功,和消息消費(fèi)的消費(fèi)方正確消費(fèi),RabbitMQ 提供了兩個(gè)確認(rèn)機(jī)制,由于消息按照流通的順序從左到右,因此為保證可靠性,MQ必須對(duì) Producer進(jìn)行確認(rèn),Consumer 必須對(duì) MQ 進(jìn)行確認(rèn)
    2022-08-08
  • Java邏輯運(yùn)算符之&&、||?與&、?|的區(qū)別及應(yīng)用

    Java邏輯運(yùn)算符之&&、||?與&、?|的區(qū)別及應(yīng)用

    這篇文章主要介紹了Java邏輯運(yùn)算符之&&、||?與&、?|的區(qū)別及應(yīng)用的相關(guān)資料,分別是&&、||?與&、?|,并探討了它們?cè)诓煌瑧?yīng)用場(chǎng)景中的表現(xiàn)和優(yōu)化效果,需要的朋友可以參考下
    2025-03-03
  • java stringbuffer的用法示例

    java stringbuffer的用法示例

    這篇文章主要介紹了java stringbuffer的用法示例,字符串緩沖區(qū),是一個(gè)容器(當(dāng)返回到的是String時(shí)而且長(zhǎng)度不確定,數(shù)據(jù)類型不確定時(shí)就可以用StringBuffer)其實(shí)底層還是數(shù)組,只是被封裝了,對(duì)外提供了方法,初始容量為16個(gè)字符
    2014-01-01

最新評(píng)論

喀喇| 万年县| 灵石县| 当涂县| 甘谷县| 黑河市| 玉山县| 荆门市| 金寨县| 汉寿县| 华亭县| 永宁县| 张家港市| 黄浦区| 上栗县| 万年县| 江陵县| 金华市| 基隆市| 丹巴县| 修水县| 北辰区| 开平市| 敦化市| 漠河县| 壤塘县| 巨野县| 芮城县| 长垣县| 濉溪县| 改则县| 大渡口区| 松江区| 尼木县| 禹州市| 安宁市| 怀柔区| 慈溪市| 佛冈县| 卓资县| 磴口县|