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

从Java 8迁移至Java 11.0.2时Gradle构建抛出NoClassDefFoundError问题求助

解决Java 11迁移中Infinispan的NoClassDefFoundError问题

兄弟,我之前刚好处理过Infinispan在Java11下的这个兼容性问题,给你梳理下问题根源和解决办法:

问题本质

你遇到的NoClassDefFoundError核心原因是依赖版本太老,完全没适配Java11的变更:

  • 你用的spring-boot-starter-infinispan:1.0.0对应Infinispan 9.x系列,这个版本依赖的JBoss Marshaller(也就是报错里的ExtendedRiverMarshaller)需要JDK内置的JAXB模块,但Java11已经把JAXB从JDK中移除了;
  • 同时Java9+限制了对JDK内部API(比如sun.misc.Unsafe)的访问,旧版Infinispan的Marshaller依赖这些内部API,直接导致类初始化失败。

解决方案(按优先级排序)

1. 升级Infinispan Starter版本(最推荐)

这是最稳妥的解决方式,直接换掉老旧依赖,使用适配Java11的版本。spring-boot-starter-infinispan:1.0.0是对应Spring Boot 1.x的版本,建议升级到Spring Boot 2.x对应的Starter版本,比如:

implementation group: 'org.infinispan', name: 'spring-boot-starter-infinispan', version: '2.1.0.RELEASE'

这个版本对应的Infinispan核心版本是10.x,已经全面支持Java11,不仅能解决当前错误,还能获得性能和安全更新。如果你的项目用的是更晚的Spring Boot版本,直接匹配对应的Starter版本即可。

2. 临时兼容配置(无法升级时用)

如果因为项目依赖限制不能升级,可通过添加JVM参数和缺失依赖临时解决:

  • 首先在build.gradle的测试任务中添加允许访问内部API的参数,同时启用JAXB模块:
test {
    jvmArgs = [
        "--add-opens=java.base/java.lang=ALL-UNNAMED",
        "--add-opens=java.base/java.nio=ALL-UNNAMED",
        "--add-opens=java.base/java.util=ALL-UNNAMED",
        "--add-modules=java.xml.bind"
    ]
}
  • 然后添加JAXB的依赖到项目中:
implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
implementation group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0.1'
implementation group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.1'

⚠️ 注意:这只是临时 workaround,依赖JDK内部API会有后续版本的兼容性风险,不推荐长期使用。

3. 替换Marshaller实现

如果升级后仍有Marshaller相关问题,可以换成Infinispan推荐的ProtoStream Marshaller——它是纯Java实现,完全兼容JPMS,不需要依赖JDK内部API:

  • 首先添加ProtoStream的依赖:
implementation group: 'org.infinispan', name: 'infinispan-protostream', version: '你的Infinispan核心版本'
  • 然后在缓存配置类里替换Marshaller:
@Bean
public EmbeddedCacheManager cacheManager() {
    ConfigurationBuilder builder = new ConfigurationBuilder();
    // 替换为ProtoStreamMarshaller
    builder.marshaller(new ProtoStreamMarshaller());
    return new DefaultCacheManager(builder.build());
}

总结

优先选择升级依赖版本,这是一劳永逸的解决办法。旧版Infinispan对Java11的支持非常有限,升级后不仅能解决当前的错误,还能避免后续更多的兼容性问题。

内容的提问来源于stack exchange,提问作者Parag Kadam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:24:08