Spring与Guava版本兼容问题:升级后出现NoClassDefFoundError
解决Spring升级后出现的
NoClassDefFoundError: com/gemstone/gemfire/internal/cache/BridgeObserverHolder问题 嘿,我来帮你捋捋这个问题!先把你的场景理清楚:
- 原运行环境:Spring 4.3.10 + Spring Security 4.2.3 + Guava 12.0 + JDK 1.7,状态正常
- 升级后环境:Spring 4.3.16 + Spring Security 4.2.4,出现
java.lang.NoClassDefFoundError: com/gemstone/gemfire/internal/cache/BridgeObserverHolder错误
错误原因分析
这个NoClassDefFoundError本质是类路径中找不到指定的GemFire内部类,核心原因是Spring升级后带来的依赖版本不匹配:
- Spring 4.3.16相比旧版本,调整了对GemFire(分布式缓存框架)的依赖逻辑——要么是默认引入了更高版本的GemFire依赖,但你的项目里没有对应版本的jar包;要么是项目中已有的GemFire版本过低,缺少这个内部类。
具体解决方案
给你几个可行的排查和解决步骤:
步骤1:补充兼容的GemFire依赖(如果项目需要)
如果你的项目确实用到GemFire,要确保引入和Spring 4.3.16兼容的版本(Spring 4.3.x一般适配GemFire 8.x或9.x早期版本)。比如在Maven中添加:<dependency> <groupId>com.gemstone.gemfire</groupId> <artifactId>gemfire-core</artifactId> <version>8.2.11</version> <scope>compile</scope> </dependency>步骤2:排除不必要的GemFire依赖(如果项目不需要)
如果你的项目根本用不上GemFire,大概率是Spring的某个模块(比如Spring Data、Spring Context)默认引入了它。你可以先定位依赖来源,再排除:- 用Maven命令查看依赖树:
mvn dependency:tree | grep gemfire - 找到引入GemFire的依赖后,添加排除规则:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.16.RELEASE</version> <exclusions> <exclusion> <groupId>com.gemstone.gemfire</groupId> <artifactId>gemfire-core</artifactId> </exclusion> </exclusions> </dependency>
- 用Maven命令查看依赖树:
步骤3:升级Guava版本规避隐性冲突
虽然当前错误和Guava无关,但Guava 12.0版本过于老旧,和Spring 4.3.16可能存在隐性兼容问题。建议升级到Guava 18.0或更高的JDK 1.7兼容版本,避免后续出现其他奇怪问题。步骤4:验证类路径一致性
检查项目打包后的lib目录,确保GemFire相关jar包版本统一,没有新旧版本共存的情况,否则容易引发类加载冲突。
额外提示
你提到的import javax.annotation.concurrent.Immutable导入语句本身没问题,它是JSR-305的注解,和当前错误无关,不用在意这个点。
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

