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

SpringBoot单元测试报错:Could not initialize class org.apache.ignite.cache.CachingProvider

运行SpringBoot单元测试时遇到Ignite CachingProvider初始化错误

环境信息

  • Java 17
  • SpringBoot 3.0.3
  • Ignite 2.14.0

错误日志

java.util.ServiceConfigurationError: javax.cache.spi.CachingProvider: Provider org.apache.ignite.cache.CachingProvider could not be instantiated
  at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
  at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:813)
  at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
  at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
  at javax.cache.Caching$CachingProviderRegistry$1.run(Caching.java:448)
  at javax.cache.Caching$CachingProviderRegistry$1.run(Caching.java:442)
  at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
  at javax.cache.Caching$CachingProviderRegistry.getCachingProviders(Caching.java:442)
  at javax.cache.Caching$CachingProviderRegistry.getCachingProviders(Caching.java:410)
  at javax.cache.Caching.getCachingProviders(Caching.java:187)
  at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$JCacheProviderAvailableCondition.getMatchOutcome(JCacheCacheConfiguration.java:160)
  at org.springframework.boot.autoconfigure.condition.AbstractNestedCondition$MemberOutcomes.getConditionOutcome(AbstractNestedCondition.java:195)
  at org.springframework.boot.autoconfigure.condition.AbstractNestedCondition$MemberOutcomes.<init>(AbstractNestedCondition.java:189)
  at org.springframework.boot.autoconfigure.condition.AbstractNestedCondition$MemberConditions.lambda$getMatchOutcomes$0(AbstractNestedCondition.java:169)
  at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:376)
  at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:289)
  at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:288)
  at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:278)
  at java.base/java.util.Optional.orElseGet(Optional.java:364)
  at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:277)
  at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31)
  at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:105)
  at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104)
  at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123)
  at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123)
  at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90)
  at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
  at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.ignite.cache.CachingProvider
  at jdk.internal.reflect.GeneratedConstructorAccessor115.newInstance(Unknown Source)
  at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
  at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
  at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
  ... 128 more
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.ExceptionInInitializerError [in thread "Test worker"]
  at org.apache.ignite.internal.util.IgniteUtils.<clinit>(IgniteUtils.java:888)
  at org.apache.ignite.cache.CachingProvider.<clinit>(CachingProvider.java:53)
  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
  ... 132 more

已尝试操作

在build.gradle中添加以下依赖后,问题仍未解决:

// https://mvnrepository.com/artifact/javax.cache/cache-api
testImplementation group: 'javax.cache', name: 'cache-api', version: '1.1.1'

解决方案

1. 升级Ignite版本(推荐)

Ignite 2.14.0不支持Jakarta EE API(SpringBoot 3.x基于Jakarta EE),升级到2.15.0及以上版本,该版本开始适配Jakarta EE 9+、SpringBoot 3和Java 17。修改build.gradle中的Ignite依赖版本即可。

2. 替换缓存API依赖(临时方案)

如果无法升级Ignite,需排除Ignite自带的javax.cache依赖,替换为Jakarta版本的缓存API:

implementation('org.apache.ignite:ignite-core:2.14.0') {
    exclude group: 'javax.cache', module: 'cache-api'
}
testImplementation 'jakarta.cache:jakarta.cache-api:2.0.1'

3. 禁用JCache自动配置

如果单元测试不需要Ignite缓存功能,直接关闭SpringBoot的缓存自动配置:

  • 在测试类上添加注解:
    @SpringBootTest(properties = "spring.cache.type=none")
    
  • 或者在application-test.properties中配置:
    spring.cache.type=none
    

4. 添加Java 17兼容VM参数

Ignite 2.14.0在Java 17下需要添加模块访问权限参数,在build.gradle的test任务中配置:

test {
    jvmArgs = [
        '--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED',
        '--add-exports=java.base/sun.nio.ch=ALL-UNNAMED',
        '--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED',
        '--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED',
        '--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED',
        '--add-opens=java.base/java.io=ALL-UNNAMED',
        '--add-opens=java.base/java.nio=ALL-UNNAMED',
        '--add-opens=java.base/java.util=ALL-UNNAMED',
        '--add-opens=java.base/java.lang=ALL-UNNAMED'
    ]
}

内容的提问来源于stack exchange,提问作者Bhavya Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:17:08