Spring整合EhCache报EhCacheFactoryBean无法初始化异常求助
问题根因
java.lang.NoClassDefFoundError: Could not initialize class org.springframework.cache.ehcache.EhCacheFactoryBean这个报错不是指类本身不存在(你能在类路径找到对应类也验证了这点),本质是JVM首次加载该类时触发了初始化失败,后续所有访问该类的请求都会直接抛出这个错误,具体触发原因有三个:
- Spring版本严重混装冲突:你标称项目使用Spring 3.2版本,但pom中引入的
spring-context-support版本为5.3.21,不同大版本的Spring组件API、字节码版本、类依赖关系完全不兼容。当类路径下同时存在3.2版本的Spring核心包(spring-core、spring-beans等)和5.3版本的spring-context-support时,EhCacheFactoryBean初始化时会找不到匹配版本的依赖类、或者触发类签名不匹配的链接错误,直接导致类初始化失败。 - Bean配置类型不匹配:
- 你定义的
ehcache是EhCacheManagerFactoryBean类型的工厂Bean,实际产出的对象是原生net.sf.ehcache.CacheManager实例,但你给EhCacheCacheManager注入属性时写的是cacheManagerRef,且直接引用了工厂Bean本身而非其产出的实例,会触发类型不匹配; filePathCache对应的EhCacheFactoryBean要求注入原生Ehcache的CacheManager实例,你之前的配置注入的是Spring封装的EhCacheCacheManager类型的bean,类型完全不匹配,会触发Bean创建失败。
- 你定义的
- 依赖传递冲突风险:Ehcache 2.10.9.2依赖slf4j等基础组件,如果类路径下存在这些组件的极低版本、或者缺失对应依赖,会导致Ehcache自身类初始化失败,连带Spring封装的Ehcache相关FactoryBean初始化报错。
修复步骤
- 统一全项目Spring版本:如果确定要保留Spring 3.2,就把
spring-context-support的版本改成和项目其他Spring依赖完全一致的3.2.x稳定版(推荐3.2.18.RELEASE);如果要使用Spring 5.3.21,就把所有Spring相关依赖(spring-core、spring-beans、spring-context、spring-tx、spring-aop等)全部统一到5.3.21版本。执行mvn dependency:tree排查所有传递引入的Spring依赖,用exclusions标签排除掉版本不一致的包,从根源解决类版本冲突。 - 修正Spring上下文配置,调整后正确的配置如下:
<!-- EhCache原生管理器工厂Bean --> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:META-INF/spring/ehcache.xml"/> </bean> <!-- Spring缓存管理器 --> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcache"/> </bean> <!-- 具体缓存实例 --> <bean id="filePathCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="ehcache"/> <property name="cacheName" value="getFilePathCache"/> </bean>
注意Spring会自动对FactoryBean做解引用,直接ref工厂Bean的id就能拿到它产出的实际CacheManager对象,不需要额外加特殊标识;EhCacheFactoryBean不要注入Spring封装的CacheManager,直接注入原生Ehcache的管理器实例即可。
- 校验Ehcache依赖完整性:执行
mvn dependency:tree确认ehcache的传递依赖(如slf4j-api)没有被排除、没有版本冲突,如果存在版本不一致就统一调整到兼容版本,避免Ehcache自身初始化失败。 - 清理构建缓存:执行
mvn clean install -U强制拉取正确版本的依赖,清除之前构建残留的旧版本class文件,再启动验证即可。
内容的提问来源于stack exchange,提问作者Harshini SG
相关产品推荐
相关产品推荐

