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
相关产品推荐
相关产品推荐

