为什么在使用Spring Redis时获得JedisConnection的noclassdefffound错误



当尝试使用spring-redis时,我得到

java.lang.NoClassDefFoundError: Could not initialize class org.springframework.data.redis.connection.jedis.JedisConnection
使用redis进行连接操作时出现

异常。我的配置方法是这样的

 @Bean
public RedisConnectionFactory jedisConnFactory() {
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setHostName("XXX.XX.XX.XXX");
    jedisConnectionFactory.setPort(6381);
    jedisConnectionFactory.setUsePool(true);
    jedisConnectionFactory.afterPropertiesSet();
    return jedisConnectionFactory;

请建议如果有人知道为什么我得到这个异常。

浪费了几乎一天,发现jar已经在我的类路径上,我进一步调试了它,发现当java的反射机制试图找到一个方法已经存在于"方法列表"中,它无法找到由于一些版本冲突Jedis版本(2.7.2)不兼容Spring Data Redis (1.5.0.RELEASE),这个问题已经在这个链接中回答::
Jedis和spring数据redis版本冲突

Redis客户端仍然保持旧包结构的最新版本是:2.10.2.

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.10.2</version>
</dependency>

3.0。X,包结构已经改变。如果spring-data-redis使用旧的包结构调用redis客户端的Pool类,则java.lang.NoClassDefFoundError

似乎最新spring-data-redis: 2.1.10。RELEASE仍然用旧的包结构调用redis客户端的Pool类,所以你需要使用redis。客户 2.10.2

当我们使用jedi Configuration时,需要JedisPoolConfig。在Spring Boot 2.0中,Spring - Boot -starter-data-redis默认给予Lettuce依赖,而不是jedi。要使用绝地武士的配置,请排除Lettuce并添加绝地武士,如下所示。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>            
</dependency>        
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

在我的例子中,我必须删除版本标签

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.2.1</version>
</dependency>

 <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
 </dependency>

最新版本的Redis客户端解决了我的问题。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.0</version>
</dependency>

更改为兼容版本:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.0.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

当我们使用jedi Configuration时,需要JedisPoolConfig。在Spring Boot 2.0中,Spring - Boot -starter-data-redis默认给予Lettuce依赖,而不是jedi。要使用绝地武士的配置,请排除Lettuce并添加绝地武士,如下所示。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
  <exclusions>
    <exclusion>
     <groupId>io.lettuce</groupId>
     <artifactId>lettuce-core</artifactId>
    </exclusion>
  </exclusions>           
</dependency>       
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
</dependency>

org.springframework.data.redis.connection.jedis.JedisConnection不在您的类路径中。请检查您是否有这个依赖项可用,如果没有,请包含它。

缺失的jar应该是,给定你的redis版本,像这样从Maven仓库redis页面,所以在形式spring-data-redist-(your-version).jar

最新更新