You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Jersey的Spring REST项目迁移Java 11启动异常排查

问题根因

你碰到的Servlet初始化异常和Java 11移除内置类没有直接关系,核心问题是你在用的Jersey 1.19.4内置了重打包的旧版本ASM,这个版本的ASM最多只支持解析Java 8编译生成的字节码,碰到Java 11编译的类文件(字节码版本55)就会直接抛出IllegalArgumentException,和你日志里的报错栈完全匹配。
Jersey 1.x整条产品线2017年就已经EOL停更,官方从来没推出过适配Java 9及以上版本的正式发布版,也不存在官方发布的Java 11适配依赖对照映射表。

可行解决方案

方案1:最小成本临时兼容(不改动现有Jersey代码)

如果短期没有重构REST层的排期,可以通过替换内置ASM版本快速跑通,步骤如下:

  • 把所有com.sun.jersey组下的依赖里自带的jersey-repackaged-asm模块全部排除
  • 单独引入7.0及以上版本的ASM(7.3.1是Java 11适配最稳定的版本),覆盖原有旧的ASM类

这个方案是社区大量开发者踩坑后验证可用的兼容方案,但因为Jersey 1.x本身已经停更,没有官方支持,上线前必须把所有REST接口、过滤器、文件上传逻辑全量回归一遍。

Maven依赖调整示例:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.19.4</version>
    <exclusions>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-repackaged-asm</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 其余jersey-core、jersey-servlet等所有jersey相关依赖,都加上上述asm排除配置 -->

<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>7.3.1</version>
</dependency>

方案2:生产环境长期方案(推荐)

直接把停更的Jersey 1.x替换为仍在活跃维护的兼容版本,从根源解决高版本JDK适配问题,适配Tomcat 9+Java 11的最优选择是升级到Jersey 2.35.x版本(这个系列仍然使用javax.servlet包,不需要改Tomcat相关的配置,适配成本最低)。

新旧依赖替换对照如下:

原有Jersey 1.19.4依赖替换为Jersey 2.35对应依赖
com.sun.jersey:jersey-core:1.19.4org.glassfish.jersey.core:jersey-common:2.35
com.sun.jersey:jersey-server:1.19.4org.glassfish.jersey.core:jersey-server:2.35
com.sun.jersey:jersey-servlet:1.19.4org.glassfish.jersey.containers:jersey-container-servlet:2.35
com.sun.jersey:jersey-client:1.19.4org.glassfish.jersey.core:jersey-client:2.35
com.sun.jersey.contribs:jersey-multipart:1.19.4org.glassfish.jersey.media:jersey-media-multipart:2.35
com.sun.jersey.contribs:jersey-apache-client4:1.19.4org.glassfish.jersey.connectors:jersey-apache-connector:2.35

升级后只需要修改web.xml里的一处配置:把Servlet初始化参数里的com.sun.jersey.config.property.packages改成jersey.config.server.provider.packages,其余自定义过滤器、拦截器的配置不需要改动,原有业务代码基本不需要调整。

额外适配项

Java 11确实移除了部分JDK内置的公共模块,你在部署时还需要补充引入以下原本JDK 8自带的依赖,避免出现类找不到的报错:

<!-- JAXB相关,Java 11移除内置实现 -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.5</version>
</dependency>
<!-- Java Activation框架,Java 11移除 -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- 通用注解相关,部分老业务代码依赖 -->
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

内容的提问来源于stack exchange,提问作者Kérdezősködő Indián

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:57:21