關(guān)于jdk8升級(jí)jdk21 cxf報(bào)錯(cuò)的踩坑記錄
項(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 + ";");上面提供的示例程序,僅供參考
參考鏈接
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java8新特性stream和parallelStream區(qū)別
這篇文章主要介紹了Java8新特性stream和parallelStream區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Spring boot Rabbitmq消息防丟失實(shí)踐
這篇文章主要介紹了Spring boot Rabbitmq消息防丟失實(shí)踐,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Java實(shí)現(xiàn)根據(jù)模板自動(dòng)生成新的PPT
這篇文章主要介紹了如何利用Java代碼自動(dòng)生成PPT,具體就是查詢數(shù)據(jù)庫(kù)數(shù)據(jù),然后根據(jù)模板文件(PPT),將數(shù)據(jù)庫(kù)數(shù)據(jù)與模板文件(PPT),進(jìn)行組合一下,生成新的PPT文件。感興趣的可以了解一下2022-02-02
java isInterrupted()判斷線程的實(shí)例講解
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于java isInterrupted()判斷線程的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05

