升级Gson 2.3至2.8.9/2.10.1部署失败,报invalid constant type:19错误
解决Gson 2.8.6+升级后JBoss部署报错
invalid constant type: 19的问题 问题根源
你遇到的invalid constant type: 19错误,本质是Gson从2.8.6版本开始改用JDK11编译,编译时引入了JDK11新增的invokedynamic字节码指令(对应常量池类型19),而你的JBoss版本的类加载器不识别这个新的字节码常量类型,导致部署失败。
虽然Gson的MANIFEST声明兼容Java7/8,但JDK11编译的字节码会包含一些低版本JDK类加载器无法解析的特性,这就是为什么2.8.5及以下版本能正常部署,2.8.6+版本报错的核心原因。
可行解决方案
1. 自行用JDK8编译Gson源码
如果必须使用Gson 2.8.9+的安全修复,可以自己用JDK8重新编译Gson:
- 克隆Gson官方仓库,切换到目标版本的tag(比如
2.8.9) - 用Ant执行编译命令(适配你的项目构建系统):
ant clean jar - 编译完成后,将生成的
gson-xxx.jar替换项目中原有的Gson依赖包
2. 升级JBoss到支持JDK11字节码的版本
如果项目允许升级容器,可将JBoss替换为WildFly 14及以上版本(WildFly是JBoss的后续迭代版本),这类新版本的类加载器已经支持JDK11及更高版本的字节码特性,能正常加载Gson 2.8.6+的jar包。
3. 临时回退到Gson 2.8.5并弥补安全漏洞
如果暂时无法调整容器或编译源码,可先回退到Gson 2.8.5,同时通过以下方式规避原漏洞:
- 对敏感类添加
@Expose(serialize = false, deserialize = false)注解,禁止序列化/反序列化敏感字段 - 自定义TypeAdapter,手动控制序列化逻辑,避免触发漏洞场景
内容的提问来源于stack exchange,提问作者Venny Suya
相关产品推荐
相关产品推荐

