Jackson XML 2.18.10 在 Java 8 报 class file version 61.0
jackson-dataformat-xml 2.18.10 的正式 JAR 曾带入 Java 17 字节码,Java 8 加载 XmlMapper 时会失败。2.18.11 工件已恢复 Java 8 字节码;应核对运行中的实际 JAR,而不是只改应用 target。
Java 8 应用只升级了 jackson-dataformat-xml,加载 XmlMapper 就出现 UnsupportedClassVersionError,提示类文件版本为 61.0,而运行时最多支持 52.0。如果实际拿到的是正式 2.18.10 JAR,要先核对这个版本的编译目标。
61 对应 Java 17,52 对应 Java 8。2.18.10 的 XML 工件确实带入了 Java 17 字节码;这不是 XML 输入格式错误,异常发生时通常还没开始解析业务文档。
2.18.11 已恢复 Java 8 工件
Jackson 2.18 维护线原本保留 Java 8 支持。正式 jackson-dataformat-xml 2.18.11 中的 XmlMapper.class 已恢复为主版本 52,构建配置也对主代码明确采用 release 8,避免在较新 JDK 构建时再次带入更高目标。
仍需留在 Java 8 的项目,可在既定依赖管理方式下采用 2.18.11 或已确认保持相同兼容性的维护版本。由 Jackson BOM、框架 BOM 或集中版本配置管理时,优先在该入口调整并查看解析结果,不随意给每个 Jackson 模块叠加互不一致的版本。
显式管理单个 XML 模块的 Maven 项目,对应引用为:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.18.11</version>
</dependency>
将版本合入已有声明,不新增第二份同坐标依赖。这个片段不代表其他 Jackson 模块都可以保持任意版本;还应核对 core、databind、annotations 以及 XML 模块的依赖约束。也不要把 Jackson 3 的坐标或 Java 要求套进这条 2.18 维护路径。
检查真正被加载的 JAR
构建文件中的版本不等于运行产物中的版本。先看依赖解析结果,再检查应用打包内容、容器或服务器的公共库目录,确认没有旧 2.18.10 优先进入 classpath。
Maven 工程可以使用已有 wrapper 查看这一组依赖:
./mvnw dependency:tree -Dincludes=com.fasterxml.jackson.dataformat:jackson-dataformat-xml
应用服务器共享库、可执行胖 JAR 与普通 classpath 的加载位置不同。记录异常中的完整类名和实际来源,按部署方式替换应用产物或受控依赖;不要直接清空整台机器的 Maven 缓存或删掉其他应用共用的 JAR。
同时核对出错进程真正使用的 JVM。开发机能运行,可能只是开发机用了较新 Java,而服务器仍是 Java 8。更换运行时也能越过字节码加载门槛,但会带来框架和部署兼容性检查,不应为了一个维护版打包问题被迫盲目升级整个 Java 环境。
应用的 target=8 改不了依赖字节码
maven.compiler.target、--release 8 或 Gradle 的应用编译目标只作用于本项目编译的代码,不会把下载的 XML JAR 自动转成 Java 8。继续重编应用而保持 2.18.10 工件不变,仍可能在同一个类上失败。
这里可以采用恢复兼容性的维护工件;若另一个库有意使用更高版本 Java API,则需要遵守那个库的最低运行时,不能把所有 class file 错误都当作误编译。
更新后,在原来发生失败的 Java 8 运行环境加载 XmlMapper,并覆盖实际使用的 XML 读写、注解及模块配置。成功标准既包括不再出现 61/52 的加载错误,也包括原有 XML 行为未变。若仍报相同版本错误,优先核对异常是否仍指向旧 JAR,或已经换成另一个不兼容的类。


