已下载Maven依赖源码,为何HSQLDB堆栈跟踪仍显示Unknown Source?
问题描述
排查单元测试运行过程中出现的异常细节时,HSQLDB相关的堆栈跟踪片段全部显示为Unknown Source。
项目基于Maven构建,已下载对应依赖的源码与文档,IDE中也确认依赖的源码路径配置正确,但堆栈的提示状态没有任何改善。
实际捕获的异常堆栈如下:
Caused by: org.hsqldb.HsqlException: incompatible data type in operation at org.hsqldb.error.Error.error(Unknown Source) at org.hsqldb.error.Error.error(Unknown Source) at org.hsqldb.NumberSequence.setDefaults(Unknown Source) at org.hsqldb.NumberSequence.<init>(Unknown Source) at org.hsqldb.ParserTable.readColumnDefinitionOrNull(Unknown Source) at org.hsqldb.ParserTable.readTableContentsSource(Unknown Source) at org.hsqldb.ParserTable.compileCreateTableBody(Unknown Source) at org.hsqldb.ParserTable.compileCreateTable(Unknown Source) at org.hsqldb.ParserDDL.compileCreate(Unknown Source) at org.hsqldb.ParserCommand.compilePart(Unknown Source) at org.hsqldb.ParserCommand.compileStatements(Unknown Source) at org.hsqldb.Session.executeDirectStatement(Unknown Source) at org.hsqldb.Session.execute(Unknown Source)
现象成因
- 堆栈中出现Unknown Source的核心逻辑非常直白:Java生成堆栈跟踪时,需要从类的字节码中读取编译阶段写入的行号映射信息,若字节码中不存在对应调试元数据,就会自动标记为Unknown Source,该逻辑和IDE中是否挂载依赖源码无直接关联
- 公开发布的HSQLDB正式版Jar包,在官方编译打包环节未开启全量调试行号信息的生成,无论IDE中配置多少源码路径,运行时执行的始终是这个不带行号信息的字节码,自然无法读取到对应行号
- IDE挂载源码的作用仅为支持本地跳转查看类实现,不会反向将源码对应的行号信息补全到正在运行的字节码中,因此对堆栈的行号显示没有任何帮助
解决方向
- 若确实需要带具体行号的HSQLDB堆栈辅助排查,可拉取对应版本的官方源码,使用
javac -g参数开启全量调试信息编译后,替换本地Maven仓库中的对应官方Jar包 - 就当前捕获的异常而言,无需依赖堆栈行号即可完成定位:
- 异常本身提示操作中存在不兼容的数据类型,结合堆栈触发位置为建表阶段的列定义解析环节,可直接检查测试脚本中的建表语句,排查是否存在HSQLDB不兼容的自增序列定义、字段长度配置超限等写法
- 核对当前使用的HSQLDB版本与ORM框架(如MyBatis、JPA)生成的建表语法的匹配度,高版本HSQLDB收紧了数据类型的校验规则,老版本适配的建表语句直接运行就可能触发该异常
内容的提问来源于stack exchange,提问作者sproketboy
相关产品推荐
相关产品推荐

