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

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生态组件版本完全一致。
  • 处理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自动装配其他缓存实现:
    spring:
      cache:
        type: ehcache
    
    同时排查starter引入的多余缓存依赖,将非Ehcache的缓存实现排除即可。

内容的提问来源于stack exchange,提问作者Hanish Bansal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:06:17