Quarkus改造Pmml模型项目异常记录及解决处理

目录
  • 前言
  • 异常如下:
  • 解决
    • 解决思路
  • stax-api百科
  • 总结

前言

这个项目是一个PMML模型跑分系统,在使用quarkus架构对其改造的过程中,在加载PMML模型时,抛了一个异常,在网上找了很多资料都没有解决,pmml项目的issue中也没有找到相关的内容,故在此记录下,给遇到问题的你做个参考

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)

解决

最后发现是一个依赖的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依赖冲突导致,这个给了我灵感,最后经过尝试验证,把stax-api这个jar找出来了。

stax-api百科

XML流API(Streaming API for XML,缩写StAX)是用于读写XML文档的应用程序接口,起源于Java社群,JSR 173定义了这个API。

传统上来说,XML的API无外乎是以下两种:

  • 基于树的API- 整个文档以树的形式被读入内存,可以被调用程序随机访问。
  • 基于事件的API - 应用注册接收事件,当原XML文档遇到事体时就会产生这些事件。

两者皆有优点,前者(例如DOM)允许对文档进行随机访问,而后者(例如SAX)需要较小的内存开销,并却通常更快。

这两个方法可以认为是正好相反。基于树的API允许无限制的,随机的访问和操纵,而基于事件的API是一次性地遍历源文档。

StAX被设计为这两者的一个折中。在StAX中,程序的切入点是表示XML文档中一个位置的光标。应用程序在需要时向前移动光标,从解析器拉出信息。

与基于事件的API(如SAX)将“数据推送”给应用程序不同的是,SAX需要应用程序维持时间间的状态,以保持文档内的位置信息。

总结

基于stax-api百科的信息,在结合异常信息,这个异常算终于水落石出了,可以判断出,这个jar的功能已经被包含进jdk中了,所以添加进新的进来就导致冲突了

以上就是Quarkus改造Pmml模型项目异常记录及解决的详细内容,更多关于Quarkus改造Pmml模型项目异常的资料请关注我们其它相关文章!

(0)

相关推荐

  • Quarkus的Spring扩展快速改造Spring项目

    目录 前言 spring-webmvc扩展 spring-datajpa扩展 spring-Di扩展 spring-boot-properties扩展 结语 前言 博主上个礼拜,已经实现了quarkus的native image应用的上线,经过两天的监控下来,一切运行指标良好,就是内存升到了100M了,这个后续继续跟进观察.今天聊点老的spring应用改造成quarkus的问题.一个新的框架是否可以顺利的在一个公司落地,除了本身优秀的设计和优异的性能外,框架的生态和上手的难度以及对现有框架的兼容

  • Quarkus云原生开篇java框架简介

    目录 前言 什么是quarkus? 为什么用quarkus? 专为开发人员而设计 容器优先 命令式和响应式代码 结语 前言 Quarkus 是小红帽开源的专门针对云容器环境优化的云原生java框架,目前已迭代到1.6.0版本,已完成了大部分的框架库的集成扩展,为了让你低成本迁移到Quarkus来,它兼容主流的框架开发模式api,如spring web. Quarkus已具备企业级应用开发能力.而且未来容器云肯定是主流了,可以预见,未来的软件都是运行在k8s这样的容器集群里.而容器环境需要应用具备

  • Quarkus集成redis操作Redisson实现数据互通

    目录 前言 集成redis 复制Redisson序列化 使用 前言 博主所在公司大量使用了redis缓存,redis客户端用的Redisson.在Quarkus集成redis时,博主尝试使用Redisson客户端直接集成,发现,在jvm模式下运行quarkus没点问题,但是在打native image时,就报错了,尝试了很多方式都是莫名其妙的异常.最后决定采用quarkus官方的redis客户端,但是Redisson客户端数据序列化方式是特有的,不是简单的String,所以quarkus中的re

  • Quarkus中实现Resteasy的文件上传下载操作

    目录 前言 文件上传 文件下载 前言 做java web开发,文件的上传和下载是一个非常常见的需求场景.在spring生态下的文件上传下载非常简单,记得五年前,我刚写博的时候也写过spring的上传和下载<SpringMvc实现文件上传与下载>,以及Struts2的文件上传和下载<java Struts2实现文件上传下载>.今天来看看Quarkus框架中是如何实现的,因为Quarkus的JAX-RS采用Resteasy的实现,故Quarkus中的文件上传和下载,也就是Resteas

  • Quarkus篇入门创建项目搭建debug环境

    目录 前言 搭建Quarkus项目 纯手工方式 官网装配器方式 IDEA方式 编写第一个Quarkus接口 启动你的应用并调试 前言 在学习一个新的框架技术前,肯定要先来一套hello word,搭建基本的运行环境和调试环境. 先来创建一个Quarkus的应用 搭建Quarkus项目 下面介绍三种创建Quarkus项目的方式 纯手工方式 1.创建maven工程,这个不多赘述,是个java程序员都会的 2.添加Quarkus依赖,下面贴出基本的依赖 <properties> <quarku

  • Quarkus改造Pmml模型项目异常记录及解决处理

    目录 前言 异常如下: 解决 解决思路 stax-api百科 总结 前言 这个项目是一个PMML模型跑分系统,在使用quarkus架构对其改造的过程中,在加载PMML模型时,抛了一个异常,在网上找了很多资料都没有解决,pmml项目的issue中也没有找到相关的内容,故在此记录下,给遇到问题的你做个参考 jpmml-evaluator:https://github.com/jpmml/jpmml-evaluator 异常如下: java.lang.LinkageError: loader cons

  • ssm项目改造spring boot项目完整步骤

    目录 添加依赖 添加启动类 拷贝项目代码 配置数据库连接池 添加依赖 连接池的自动配置方式 配置 Druid 连接池 集成 MyBatis 添加依赖 配置 Mapper 对象 MyBatis配置属性 事务管理 添加依赖 注解方式 配置切换代理 测试验证 集成 Web 添加依赖 修改端口 目录结构 静态资源的一些处理 前端控制器映射路径配置 集成 Thymeleaf 添加依赖 相关配置 修改模板文件 统一异常处理 框架自带方式 控制器增强器方式 添加注册多个拦截器 系统日志 为什么要用日志 Spr

  • Springboot使用Logback实现日志配置与异常记录

    目录 概述 logback配置详解 logback配置 异常情况 概述 默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件.如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径.日志格式等.复杂的场景(区分 info 和 error 的日志.每天产生一个日志文件等)满足不了,只能自定义配置文件logback-spring.xml或者logback.xml.本篇文章主

  • 使用Nuxt.js改造已有项目的方法

    前言 如果我们需要对现有的vue项目进行ssr改造,使用nuxt.js是一个不错的选择.这里用作例子的"现有项目"是一个"高仿"饿了么外卖APP的spa.不过我没有把全部功能开发出来(全部做出来就不得了了),只是做出几个基本界面意思意思 下面就以这个demo为小白鼠进行ssr改造 准备 现有目录 很明显,这是使用vue-cli搭建的项目 其中prod.server.js是build之后的启动文件 dataa.json文件是模拟数据,在build/dev-server

  • NetCore实现全局模型绑定异常信息统一处理(场景分析)

    本文主要讲解NetCore如何使用中间件捕获模型绑定的异常信息 场景 在.NET Core 中请求中,如果参数的类型错误,我们在控制器中定义的方法是不会执行的,当我们需要捕获模型绑定的异常信息时,可以使用ApiBehaviorOptions..接下来通过一个小demo给大家讲解一下用法 实现代码 public static void ConfigureModelBindingExceptionHandling(this IServiceCollection services) { service

  • 记一次django内存异常排查及解决方法

    起因 Django 作为 Python著名的Web框架,相信很多人都在用,自己工作中也有项目项目在用,而在最近几天的使用中发现,部署Django程序的服务器出现了内存问题,现象就是运行一段时间之后,内存占用非常高,最终会把服务器的内存耗尽,对于Python项目出现内存问题,自己之前处理过一次,所以并没有第一次解决时的慌张,自己之前把解决方法也整理了:https://www.jb51.net/article/151604.htm 但是事情似乎并没有我想的那么简单,自己尝试用之前的的方法tracem

  • BootStrap3使用错误记录及解决办法

    错误内容: glyphicons-halflings-regular.svg文件出错如下, The content of element type "font-face" is incomplete, it must match "((font-face-src,(desc|title|metadata)*)|((desc|title|metadata) +,font-face-src,((desc|title|metadata))*?))". 解决办法: 源代码:

  • vue项目中使用lib-flexible解决移动端适配的问题解决

    第一部分:项目中引入lib-flexible 一.项目中安装lib-flexible $ npm install lib-flexible --save 二.在项目的入口js文件中引入lib-flexible import 'lib-flexible' 通过要以上两步,就完成了在vue项目使用lib-flexible来解决移动端适配了. lib-flexible会自动在html的head中添加一个meta name="viewport"的标签,同时会自动设置html的font-size

  • vue init webpack 建vue项目报错的解决方法

    使用vue init webpack 创建vue项目时报如下错误: vue init webpack my-project C:\Users\computer\AppData\Roaming\npm\node_modules\vue-cli\bin\vue-init:60 let template = program.args[0] ^^^ SyntaxError: Block-scoped declarations (let, const, function, class) not yet s

随机推荐