Pagehelper触发 JVM 类校验失败,Idea 却因 -noverify 藏了雷

问题现象

最近一个老的微服务引入了page-helper 6.0版本的 jar 包之后,微服务发布到环境上去之后直接启动不起来了,报no such constructor错误,但是,这个微服务在发布到环境上的时候在本地 Idea 里面启动过,但是在 Idea 里面启动缺没有任何报错。如下图所示:

问题复现

使用下面的 pom 文件引入依赖包,然后将项目打包项目为 jar 包启动就可以复现问题,配置如下:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.18.RELEASE</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

但是直接在 Idea 里面启动项目,则可以看到是可以正常启动的。如下图所示:

问题原因

启动报错原因

从上面报错的堆栈信息可以看到是在AbstractDialect的 57 行报的错,但是查看这行代码,实际上就是通过 lambda 表达式创建了一个DefaultCountSqlParser对象,代码如下:

同时查看DefaultCountSqlParser的源码发现,它本身也没有定义任何有参数的构造函数,那它应该是默认有无参构造函数的,那为啥会报no such constructor错误呢?问题定位到这里有点定位不下去了。代码如下:

后来又再次去看了报错的堆栈日志,发现在它的下面还有Caused by: java.lang.VerifyError: Bad return type报错。如下图所示:

然后拿着这个报错去问了下 AI,AI 的回答:可能是 jar 包编译时的版本和运行时的版本不一致,且涉及到了方法签名的变更。如下图所示:

同时查看上面报错的堆栈信息提到了DefaultCountSqlParsersqlToCount()方法,原因是:net/sf/jsqlparser/statement/select/PlainSelect is not assignable to net/sf/jsqlparser/statement/select/Select

然后查看这个方法,发现它方法的返回值声明类型是net/sf/jsqlparser/statement/select/Select,方法内部返回的是net/sf/jsqlparser/statement/select/PlainSelect类型。如下图所示:

查看net/sf/jsqlparser/statement/select/PlainSelect确实和net/sf/jsqlparser/statement/select/Select没有继承关系,同时发现当前实际引入的jsqlparser的版本是 1.1 的版本。然后去 maven 搜索这个 jar 包,发现pagehelper-spring-boot-starter实际想要引入的jsqlparser版本是 4.7 的版本,但是因为引入了mybatis-plus的 2.3.3 版本,它引入了jsqlparser的版本是 1.1,同时因为它和pagehelper-spring-boot-starter依赖jsqlparser的路径长度相同,且它在 pom 文件声明的前面。按照 maven 依赖调节的原则:路径长度相同时会取声明在前的,因此引入了jsqlparser的 1.1 版本。如下图所示:

从类加载的过程分析上面的报错:通过new DefaultCountSqlParser属于对一个类型的主动引用,会触发类加载,类加载又分为:加载、验证、准备、解析、初始化。

根据《深入理解JVM虚拟机》书中解释:在验证过程中会对方法的字节码进行验证。如下图所示:

对于本案例中,在验证的过程中,JVM 发现sqlToCount()方法声明返回net/sf/jsqlparser/statement/select/Select,同时方法体中返回的是net/sf/jsqlparser/statement/select/PlainSelect类型,这就要求它们有继承关系,但是因为当前引入的是jsqlparser的版本是 1.1 版本,在这个 jar 包它们两个并不具备父子关系,因此校验失败了。

Idea 启动不报错原因

那为啥打包成 jar 包启动就会报错,但是在 Idea 中启动就不报错呢?最开始我以为是 Idea 自动引入了新版本的 jar 包,但是我把 Idea 的启动命令拷贝出来,搜索classpath中设置的jsqlparser版本,发现它引入的也是 1.1 版本,到这里感觉怎么都解释不通了呀!如下图所示:

后面又回去翻了翻书,发现书上说有个-Xverify:none参数可以关闭校验,巧了的是上面启动命令图中的第一行的最后恰好就是这个参数(-noverify 实际上就是 -Xverify:none 的一个快捷别名)。

真相终于大白了,Idea 默认应该是把类加载的验证这个操作给关闭了,因此通过 Idea 启动的时候不会进行校验,自然也不会报错了。

那如何让 Idea 启用校验呢?在 Idea 的 Run/Debug Configurations 这里把 Disable launch optimization 这个配置相勾选上,然后启动项目,在控制台就可以看到一模一样的报错了。如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1220200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web测试和App测试的区别

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 相同点从软件测试方法看都需要进行功兼容性测试&#xff0c;能测试、性能测试、GUI测试&#xff0c;安全性测试&#xff0c;易用性测试等从软件测试流程看都需要…

2026成都壁挂炉维修优质服务推荐榜

2026成都壁挂炉维修优质服务推荐榜行业背景与筛选依据据《2026-2026中国家电维修行业发展白皮书》数据显示,成都地区壁挂炉保有量年增长率达18%,冬季供暖季维修需求环比提升47%。但市场服务存在技术水平参差不齐、响…

超纯水哪家口碑好?技术、服务与用户反馈全解析

市场分析 近年来,随着半导体制造、生物医药、高端科研等领域对水质要求的不断提升,超纯水设备市场需求持续增长。据行业数据显示,2026年中国超纯水市场规模已达到约120亿元,年增长率保持在15%以上。其中,半导体(占…

2026成都专业律师事务所推荐榜:成都遗产继承律师事务所、成都刑事律师事务所、成都交通事故罪辩护律师事务所、成都借款纠纷律师事务所选择指南

2026成都专业律师事务所推荐榜 引言据《2026中国刑事法律服务行业白皮书》数据显示,2026年全国刑事法律服务市场规模同比增长18%,其中成都地区因经济活跃度提升、企业合规意识增强,刑事纠纷案件量同比增长15%,刑事…

微美全息(NASDAQ:WIMI)BlockEdge框架:为工业4.0开辟区块链与边缘计算创新之路

工业4.0&#xff0c;作为新工业革命的里程碑&#xff0c;不仅预示着制造业的全面数字化转型&#xff0c;还承载着实现安全、智能、自主和自适应工业物联网&#xff08;Industrial Internet of Things&#xff0c;IIoT&#xff09;的宏伟愿景。这一转型不仅仅是技术的迭代升级&a…

使用postgresql、postgis数据库作为存储仓库,发布geoserver矢量切片服务(pbf切片)、矢量切片图层组服务

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a; gis工程师 文章目录一、&#x1f340;前言1.1 ☘️GeoServer、pbf矢量切片扩展安装1.2…

NOKOV 度量动作捕捉助力多飞行器集联平台(IAP)高精度定位研究|北理工俞玉树团队成果解读

本文围绕多飞行器集联平台(IAP)的精准定位与控制问题,系统介绍了北理工俞玉树团队基于视觉惯性、多智能体融合与运动学约束的研究进展。通过真实飞行实验验证,借助 NOKOV 度量动作捕捉 提供高精度位姿真值,有效评…

2026最新抗菌316厨具/家用食堂厨具/食品304厨具/纯钛厨具/厨具定制批发推荐:五星厨具专家,20年品质护航

在厨具市场日益注重材质安全与品质体验的今天,选择一款健康、耐用且兼具设计感的厨具至关重要。2026年,在众多厨具品牌中,欧乐多(广州)贸易有限公司(简称“欧乐多”)凭借20余年的行业深耕与卓越的产品实力,成为…

Windows 下隐藏命令行子进程窗口的技术方案

Windows 下隐藏命令行子进程窗口的技术方案 问题背景 在 Windows 平台使用 Rust 开发 GUI 桌面应用时&#xff0c;通过 std::process::Command 调用外部命令行工具会伴随弹出黑色控制台窗口&#xff0c;影响用户体验。 核心机制 Windows 系统提供 CREATE_NO_WINDOW 进程创建…

右键菜单管理

一、右键菜单的用户痛点与工具诞生逻辑 Windows 系统的右键菜单是高频操作入口&#xff0c;但随着软件安装量增加&#xff0c; 会逐渐暴露三大核心痛点&#xff1a; 菜单臃肿冗余&#xff1a;多数软件安装后会强制在右键菜单添加自身选项&#xff08;如解压、编辑、分享等&…

【大模型开源教程】Llama3-Chinese-8B:专为中文打造的大语言模型,领航智能对话

一、介绍 LLaMA 3 (Large Language Model Meta AI) 是 Meta&#xff08;原 Facebook&#xff09;发布的一个大规模预训练语言模型系列的第三代版本。LLaMA 3 旨在推动自然语言处理&#xff08;NLP&#xff09;的研究和应用&#xff0c;其系列模型具有较强的语言理解和生成能力…

基于SpringBoot的闪电队篮球俱乐部管理系统的设计与开发(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。 一、程序背景 随着篮球运动的普及&#xff0c;篮球俱乐部日常运营涉及球员、教练、赛程等多维度管理&a…

大型语言模型(LLMs)是怎样“学习”的?一封给网络工程师的大模型指南

数字时代&#xff0c;人工智能&#xff08;AI&#xff09;及其相关技术正日益成为许多领域的热门话题。其中&#xff0c;生成式人工智能&#xff08;Gen AI&#xff09;和大型语言模型&#xff08;LLMs&#xff09;引起了广泛的兴趣和讨论。然而&#xff0c;尽管这些术语在科技…

Node.js 编程实战:部署 Node.js 应用 —— Docker 容器化部署

随着 Node.js 应用从开发环境迁移到生产环境&#xff0c;传统的直接部署方式&#xff08;如裸机、PM2 守护进程&#xff09;虽然可行&#xff0c;但在环境一致性、快速部署、可扩展性上仍存在一定局限。 Docker 容器化部署提供了一种轻量、可移植、环境一致的解决方案&#xf…

2026最新家用/食堂厨具品牌推荐!中高端原创厨具权威榜单发布,品质与创新双优之选

引言 随着健康生活理念的深入普及和家庭烹饪需求的多样化升级,消费者对厨具产品的材质安全、设计美学与耐用性能提出了更高要求。然而,当前市场上厨具品牌鱼龙混杂,材质以次充好、设计同质化等问题屡见不鲜,严重影…

ModbusRTC学习

1. ModbusRTU介绍 ModbusRTC本身只定义了数据报文的结构&#xff0c;底层物理链接依赖与串行通信标准。主从通信模式&#xff0c;一个主站设备发起请求&#xff0c;一个或多个从站设备响应请求全双工 异步通信 2. 物理层 - modbusRTU的载体 2.1 RS485 RS-485 是 Modbus RT…

2026高中辅导性价比实测TOP3,家长选班不踩坑

2026高中辅导性价比实测TOP3,家长选班不踩坑作为深耕K12教育多年的博主,每天都能收到家长私信:“哪家高中辅导机构性价比高?”“如何选到能帮孩子精准提分的辅导机构?” 双减+新高考背景下,课外辅导需求依旧旺盛…

为什么 OpenCSG 更符合中国式开源道路:技术主权、产业自主与生态可控的交汇点

​ 在中国,开源从来不是“技术炫技”的舞台,而是国家与产业能力建设的一条主路径。衡量一个平台是否具备成为开源领域关键基础设施级平台的潜质,关键不在体量,而在它是否能够同时满足四个长期目标:技术主权、产业…

2026最新食品304厨具推荐!国内优质厨具权威榜单发布,资质品质双优助力健康烹饪食品304厨具服务公司推荐

引言 随着国民健康意识的提升和厨房生活品质需求的升级,食品级厨具的安全性、耐用性与设计感成为消费者关注的核心。当前厨具市场品牌众多,但材质真实性、工艺标准参差不齐等问题仍然存在,选择优质可靠的食品304厨具…

矿卡应该使用什么样子的网关或者路由器?

做矿山车辆通信这么多年,接到最多的咨询就是:"我们矿上的卡车到底该配什么样的网关?"说实话,这个问题看似简单,但真正要给出一个靠谱的答案,得把矿山的实际工况掰开了揉碎了分析。今天这篇文章,我就从…