Gradle项目运行时出现Could not load requested class: jcache错误排查求助
问题排查与解决方案
首先,你的错误java.lang.ClassNotFoundException: Could not load requested class : jcache有两个核心诱因:Hibernate缓存区域工厂类配置错误,以及Hibernate相关依赖版本严重不一致,我们一步步来解决:
1. 修正Hibernate缓存配置(直接解决类找不到的问题)
错误日志显示Hibernate尝试加载名为jcache的类,这是因为你的Hibernate配置文件(比如hibernate.cfg.xml或persistence.xml)中,hibernate.cache.region.factory_class的配置值写错了。
正确的JCache区域工厂类名必须是全限定类名,而不是简写的jcache:
<!-- 替换错误的配置 --> <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jcache.JCacheRegionFactory"/>
如果你的项目实际想用Ehcache作为缓存实现(毕竟你引入了hibernate-ehcache),则应该对应配置Ehcache的区域工厂:
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
2. 统一Hibernate依赖版本(解决潜在兼容性问题)
你的build.gradle里Hibernate组件版本混乱得很:
hibernate-core、hibernate-hikaricp等是5.2.10.Final,但hibernate-ehcache直接跳到了5.6.8.Final(跨了3个大版本)hibernate-entitymanager是5.5.2.Final,但Hibernate 5.2+已经把这个组件合并到hibernate-core里了,完全没必要单独引入- 还存在重复的JPA API依赖(
javax.persistence-api:2.2和hibernate-jpa-2.0-api:1.0.1),这会导致类加载冲突
修正后的依赖配置
用Gradle的版本变量统一管理Hibernate版本,移除冗余依赖:
// 统一管理版本号,后续维护更方便 ext { hibernateVersion = '5.2.22.Final' // 选5.2系列的稳定版,和你原有的核心版本兼容 } dependencies { runtime "com.google.guava:guava:28.1-jre" runtime "com.opencsv:opencsv:3.9" runtime "gradle.plugin.nl.javadude.gradle.plugins:license-gradle-plugin:0.14.0" runtime "org.yaml:snakeyaml:1.25" runtime "org.postgresql:postgresql:42.0.0" runtime "mysql:mysql-connector-java:5.1.41" // 统一版本的Hibernate核心组件 runtime "org.hibernate:hibernate-core:${hibernateVersion}" runtime "org.hibernate:hibernate-hikaricp:${hibernateVersion}" runtime "org.hibernate:hibernate-validator:${hibernateVersion}" runtime "org.hibernate:hibernate-jcache:${hibernateVersion}" runtime "org.hibernate:hibernate-ehcache:${hibernateVersion}" // Hibernate Search 5.7.x本来就兼容Hibernate 5.2.x,版本不用改 runtime "org.hibernate:hibernate-search-orm:5.7.0.Final" // 只保留一个JPA API依赖(Hibernate 5.2支持JPA 2.1+,2.2版本完全兼容) runtime 'javax.persistence:javax.persistence-api:2.2' }
3. 补充必要的缓存实现依赖(如果用JCache)
如果你确实需要用JCache作为缓存实现,除了hibernate-jcache,还得引入具体的JCache实现库(比如Ehcache 3):
// 添加JCache实现(示例:Ehcache 3) runtime "org.ehcache:ehcache:3.8.1" runtime "javax.cache:cache-api:1.1.1"
验证步骤
- 清理旧的构建缓存:执行
gradle clean - 重新构建项目:
gradle build - 运行项目:
gradle run
内容的提问来源于stack exchange,提问作者Maher Ben Taleb Ali
相关产品推荐
相关产品推荐

