从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
相关产品推荐
相关产品推荐

