JDK8环境下WildFly 8启动报JBAS015852无法索引module-info.class警告求助
告警本质说明
之前的初步判断完全准确,该告警和JEP 238机制直接相关:
- JEP 238是JDK9引入的多版本JAR规范,其中新增的
module-info.class是模块化类文件,采用Java 9及以上版本才定义的类文件常量池结构。 - 当前WildFly 8环境内置的
jandex-1.1.0.Final是早期字节码索引工具,仅支持解析Java 8及更早版本的类文件常量池,无法识别Java 9之后新增的常量池标签,在扫描到JAR包内的module-info.class时,就会抛出“Unknown tag”的解析异常。 - 该告警本身不会影响业务正常运行:JDK8运行时会自动忽略JAR包内的
module-info.class,仅在WildFly启动执行注解索引的阶段,因为无法解析未知类文件输出警告,不会干扰类加载和业务功能执行。
修复/消除启动告警的方案
按推荐优先级排序:
- 降级第三方类库版本,选择不包含
module-info.class的JDK8兼容版本。比如告警中出现的两个类库:- gson 从2.8.6版本开始在JAR包内内置
module-info.class,适配JDK8的最高可用版本为2.8.5 - jackson-core 从2.10.0版本开始在JAR包内内置
module-info.class,适配JDK8的最高可用版本为2.9.10.8
- gson 从2.8.6版本开始在JAR包内内置
- 升级WildFly内置的Jandex组件版本。Jandex 2.0.0.Final及以上版本已经支持正确识别、跳过
module-info.class文件,不会再触发解析异常,适合确实需要使用新版类库的场景,替换WildFly模块目录下的旧版jandex jar即可。 - 直接过滤忽略告警。如果验证过业务运行正常、注解扫描无异常,这类WARN级别的日志不影响运行,可通过日志配置过滤
JBAS015852对应的日志输出,减少启动日志噪音。
查询JDK8兼容最高类库版本的通用方法
- 查阅类库官方发布的版本兼容性说明:主流开源类库的构建配置中会明确标注编译目标版本,只要标注的编译目标为Java 8,且未声明要求Java 9及以上运行环境,就属于兼容JDK8的版本。
- 校验版本包内容:查看目标版本JAR的文件列表,如果根目录存在
module-info.class文件,说明该版本已经引入Java 9模块化内容,需要回退到该版本之前的最后一个稳定版本。 - 快速校验命令:获取jar包后执行
jar tf 目标jar包路径命令,输出列表中如果出现根目录下的module-info.class,就说明该版本会触发当前环境的告警。
内容的提问来源于stack exchange,提问作者peter.petrov
相关产品推荐
相关产品推荐

