Quarkus改造Pmml模型項目異常記錄及解決處理
前言
這個項目是一個PMML模型跑分系統(tǒng),在使用quarkus架構對其改造的過程中,在加載PMML模型時,拋了一個異常,在網(wǎng)上找了很多資料都沒有解決,pmml項目的issue中也沒有找到相關的內(nèi)容,故在此記錄下,給遇到問題的你做個參考
jpmml-evaluator:https://github.com/jpmml/jpmml-evaluator
異常如下:
java.lang.LinkageError: loader constraint violation: when resolving field "DATETIME" of type javax.xml.namespace.QName, the class loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @58fd1214 (instance of io.quarkus.bootstrap.classloading.QuarkusClassLoader, child of 'platform' jdk.internal.loader.ClassLoaders$PlatformClassLoader) of the current class, com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl, and the class loader 'bootstrap' for the field's defining type, javax.xml.datatype.DatatypeConstants, have different Class objects for type javax.xml.namespace.QName at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.<clinit>(RuntimeBuiltinLeafInfoImpl.java:254) at com.sun.xml.bind.v2.model.impl.RuntimeTypeInfoSetImpl.<init>(RuntimeTypeInfoSetImpl.java:33) at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:98) at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:54) at com.sun.xml.bind.v2.model.impl.ModelBuilder.<init>(ModelBuilder.java:132) at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.<init>(RuntimeModelBuilder.java:62) at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:425) at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:273) at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:109) at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1126) at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:135) at com.sun.xml.bind.v2.JAXBContextFactory.createContext(JAXBContextFactory.java:35) at javax.xml.bind.ContextFinder.find(ContextFinder.java:393) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:691) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:632) at org.jpmml.model.JAXBUtil.getContext(JAXBUtil.java:103) at org.jpmml.model.JAXBUtil.createUnmarshaller(JAXBUtil.java:143) at org.jpmml.evaluator.LoadingModelEvaluatorBuilder.load(LoadingModelEvaluatorBuilder.java:88) at org.jpmml.evaluator.LoadingModelEvaluatorBuilder.load(LoadingModelEvaluatorBuilder.java:78) at org.jpmml.evaluator.LoadingModelEvaluatorBuilder.load(LoadingModelEvaluatorBuilder.java:66)
解決
最后發(fā)現(xiàn)是一個依賴的jar包中帶的一個依賴stax-api導致的問題,實際上并沒有使用到這個依賴,所以排除即可
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.6.0</version> <exclusions> <exclusion> <artifactId>stax-api</artifactId> <groupId>stax</groupId> </exclusion> </exclusions> </dependency>
解決思路
剛看到這個異常時,沒有啥想法,加載程序約束沖突,這個還是頭一次見,后面就在PMML的github倉庫上找issue里的關鍵信息,一無所獲。最后把異常message放google上搜到了兩條關鍵信息,如下:
信息一:https://youtrack.jetbrains.com/issue/JT-7922
信息二:https://serverfault.com/questions/401890/
其中,信息一的異常匹配度非常高,達到了100%的異常消息匹配,但是沒有說解決方案,信息二雖然也沒給出具體的方案,但是談到了可能是jar依賴沖突導致,這個給了我靈感,最后經(jīng)過嘗試驗證,把stax-api這個jar找出來了。
stax-api百科
XML流API(Streaming API for XML,縮寫StAX)是用于讀寫XML文檔的應用程序接口,起源于Java社群,JSR 173定義了這個API。
傳統(tǒng)上來說,XML的API無外乎是以下兩種:
- 基于樹的API- 整個文檔以樹的形式被讀入內(nèi)存,可以被調用程序隨機訪問。
- 基于事件的API - 應用注冊接收事件,當原XML文檔遇到事體時就會產(chǎn)生這些事件。
兩者皆有優(yōu)點,前者(例如DOM)允許對文檔進行隨機訪問,而后者(例如SAX)需要較小的內(nèi)存開銷,并卻通常更快。
這兩個方法可以認為是正好相反?;跇涞腁PI允許無限制的,隨機的訪問和操縱,而基于事件的API是一次性地遍歷源文檔。
StAX被設計為這兩者的一個折中。在StAX中,程序的切入點是表示XML文檔中一個位置的光標。應用程序在需要時向前移動光標,從解析器拉出信息。
與基于事件的API(如SAX)將“數(shù)據(jù)推送”給應用程序不同的是,SAX需要應用程序維持時間間的狀態(tài),以保持文檔內(nèi)的位置信息。
總結
基于stax-api百科的信息,在結合異常信息,這個異常算終于水落石出了,可以判斷出,這個jar的功能已經(jīng)被包含進jdk中了,所以添加進新的進來就導致沖突了
以上就是Quarkus改造Pmml模型項目異常記錄及解決的詳細內(nèi)容,更多關于Quarkus改造Pmml模型項目異常的資料請關注腳本之家其它相關文章!
相關文章
淺談springboot內(nèi)置tomcat和外部獨立部署tomcat的區(qū)別
這篇文章主要介紹了淺談springboot內(nèi)置tomcat和外部獨立部署tomcat的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10詳解Spring mvc DispatchServlet 實現(xiàn)機制
本篇文章主要介紹了詳解Spring mvc DispatchServlet 實現(xiàn)機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Java實現(xiàn)企業(yè)微信消息推送功能的詳細步驟
這篇文章主要介紹了Java實現(xiàn)企業(yè)微信消息推送功能,本文圖文實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04