Ehcache3.8.1初始化报Multiple factories for non-plural service异常
问题描述
初始化Ehcache 3.8.1时抛出如下异常:
Caused by: org.ehcache.core.spi.ServiceLocator$DependencyException: Multiple factories for non-plural service at org.ehcache.core.spi.ServiceLocator$DependencySet.lookupService(ServiceLocator.java:382) at org.ehcache.core.spi.ServiceLocator$DependencySet.lookupDependenciesOf(ServiceLocator.java:357) at org.ehcache.core.spi.ServiceLocator$DependencySet.build(ServiceLocator.java:316)
初始化缓存所用的代码如下:
CacheManager cacheManager = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider") .getCacheManager(); Cache<K, V> cache = cacheManager.getCache("my-cache");
异常产生原因
这个Multiple factories for non-plural service错误是Ehcache 3.x SPI服务加载机制的校验异常,代表框架启动时发现同一个不支持多实现的服务接口,被注册了多个工厂实现,在3.8.1版本下触发该问题的常见原因有两类:
- 类路径存在Ehcache依赖冲突:同时引入了多个不同版本的ehcache核心包,或者ehcache相关组件(如ehcache-jsr107、ehcache-clustered)版本号不统一,导致同一SPI接口被重复注册
- JSR107服务重复注册:类路径下除了Ehcache的JCache实现,还存在其他符合JSR107规范的缓存实现(如Caffeine JSR107适配、其他缓存客户端的JCache包),SPI扫描时多个同类型服务同时加载触发校验失败
解决方法
按照以下步骤逐一排查处理:
- 清理重复Ehcache依赖
用构建工具输出依赖树排查重复包:- Maven环境执行:
mvn dependency:tree | grep ehcache(Linux/Mac)、mvn dependency:tree | findstr ehcache(Windows) - Gradle环境执行:
./gradlew dependencies | grep ehcache
找到所有非3.8.1版本的ehcache相关依赖,在引入位置通过exclusion规则排除,保证所有ehcache生态组件版本完全一致。
- Maven环境执行:
- 处理JSR107实现冲突
如果项目不需要同时使用多个JCache实现,直接排查并排除类路径下多余的JSR107缓存包即可。
如果项目必须保留多个缓存实现,不要调用无参的getCacheManager()方法走默认类路径扫描,显式传入Ehcache配置的URI和专属类加载器,避免跨实现的SPI加载冲突,修正后的代码如下:CachingProvider provider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider"); // 替换为项目中实际ehcache配置文件的路径 URI configUri = Thread.currentThread().getContextClassLoader().getResource("ehcache.xml").toURI(); CacheManager cacheManager = provider.getCacheManager(configUri, Thread.currentThread().getContextClassLoader()); Cache<K, V> cache = cacheManager.getCache("my-cache"); - Spring Boot场景适配
如果是Spring Boot项目中出现该异常,首先在配置中显式指定缓存类型为Ehcache,避免Spring自动装配其他缓存实现:
同时排查starter引入的多余缓存依赖,将非Ehcache的缓存实现排除即可。spring: cache: type: ehcache
内容的提问来源于stack exchange,提问作者Hanish Bansal
相关产品推荐
相关产品推荐

