Spring Data Redis整合Jedis出现NoClassDefFoundError问题求助
错误信息
java.lang.NoClassDefFoundError: org/springframework/data/geo/Metric
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.(JedisConnectionFactory.java:93)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at de.hybris.platform.spring.LazyInitOverrideBeanFactoryPostProcessor.forName(LazyInitOverrideBeanFactoryPostProcessor.java:82)
at java.base/java.util.Optional.map(Optional.java:265)
注:切换至Jedis 3.x版本后仍出现相同错误。
当前依赖配置
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.0</version> </dependency>
Bean配置
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="localhost"/> <property name="port" value="6379"/> </bean> <bean id ="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/> <!-- redis template definition --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="jedisConnFactory" ref="jedisConnFactory"/> <property name="keySerializer" ref="stringRedisSerializer"/> <property name="valueSerializer" ref="jdkSerializationRedisSerializer"/> </bean>
问题分析与解决方案
根因
org.springframework.data.geo.Metric类属于spring-data-commons组件,当前依赖中缺少该依赖,或存在版本冲突导致类无法加载。spring-data-redis本身依赖spring-data-commons,但在Hybris这类复杂环境中,可能出现依赖传递失效、版本不匹配的情况。
解决方案
显式添加spring-data-commons依赖
确保版本与spring-data-redis一致(2.7.6),添加以下依赖:<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> <version>2.7.6</version> </dependency>排查依赖冲突
执行Maven命令查看依赖树,检查是否存在不同版本的spring-data-commons:mvn dependency:tree | grep spring-data-commons若发现冲突,在spring-data-redis依赖中排除旧版本:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.7.6</version> <exclusions> <exclusion> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> </exclusion> </exclusions> </dependency>Hybris环境额外检查
确保依赖被加入Hybris的extension依赖配置中,避免类加载器隔离导致的类无法访问问题。
内容的提问来源于stack exchange,提问作者adidam dileep

