为什么在使用Spring Redis时为JedisConnection获取NoClassDefFound错误

时间:2015-10-14 14:36:03

标签: java spring redis

你好在尝试使用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;

如果有人知道为什么我会收到这个例外,请建议。

7 个答案:

答案 0 :(得分:5)

浪费了差不多一天后发现jar已经在我的课程路径上了,我进一步调试了它,发现当java的反射机制试图找到一个已经存在于&#34中的方法时;方法列表"由于 Jedis版本(2.7.2)与Spring Data Redis(1.5.0.RELEASE)不兼容之间的某些版本冲突无法找到,此问题已在此链接中得到解答: :
Jedis and spring data redis version conflict

答案 1 :(得分:4)

当我们使用Jedis配置时,需要使用JedisPoolConfig。在Spring Boot 2.0中,默认情况下spring-boot-starter-data-redis赋予Lettuce依赖关系,而不是Jedis。要使用Jedis配置,请排除莴苣并按以下方式添加Jedis。

<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>

答案 2 :(得分:3)

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.clients 2.10.2

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

org.springframework.data.redis.connection.jedis.JedisConnection不在您的类路径中。请检查您是否具有此依赖项,如果缺少该依赖项,请将其包括在内。

根据你的redis版本,丢失的jar应该来自Maven repository redis page,因此格式为spring-data-redist-(your-version).jar

答案 5 :(得分:0)

更改为兼容版本:

<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>

答案 6 :(得分:0)

当我们使用Jedis配置时,需要使用JedisPoolConfig。在Spring Boot 2.0中,默认情况下spring-boot-starter-data-redis赋予Lettuce依赖关系,而不是Jedis。要使用Jedis配置,请排除莴苣并按以下方式添加Jedis。

<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>