当前位置:   article > 正文

redisson无法连接redis jar包冲突_org.redisson.api.redissonclient' that could not be

org.redisson.api.redissonclient' that could not be found.

限贴下代码

  1. package com.shinedata.util.redis;
  2. import org.redisson.Redisson;
  3. import org.redisson.api.RedissonClient;
  4. import org.redisson.config.Config;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. /**
  10. * @ClassName RedissonConfig
  11. * @Author yupanpan
  12. * @Date 2019/10/21 9:27
  13. */
  14. @Configuration
  15. public class RedissonConfig {
  16. private static final Logger logger = LoggerFactory.getLogger(RedissonConfig.class);
  17. @Bean
  18. public RedissonClient redissonClient(){
  19. RedissonClient redisson = null;
  20. try {
  21. Config config = new Config();
  22. String redisUrl = String.format("redis://%s:%s","xxxxxxx","6379");
  23. config.useSingleServer().setAddress(redisUrl).setPassword("artstep!@#$%QWERT");
  24. redisson = Redisson.create(config);
  25. }catch (Exception e){
  26. logger.error("初始化redisson失败",e);
  27. e.printStackTrace();
  28. }
  29. return redisson;
  30. }
  31. }

死活连接不上,还有根本不报错,反正项目就是起不起来,各种问题都找了,连接密码等信息都没错,然后debug跟源码,它居然把异常屏蔽自己处理了

发现了报个错误:java.lang.NoSuchMethodError: io.netty.resolver.dns.DnsAddressResolverGroup.<init>(Ljava/lang/Class;Lio/netty/resolver/dns/DnsServerAddressStreamProvider;)V

问题点找到了,第一眼看到这种错误就差不多是jar报冲突,因为报在netty,在引入redisson的时候会自动引入netty,因为redisson基于netty的。

然后在idea查看jar下解决,步骤

 项目maven栏右击项目查看jar

查看依赖关系图,找到冲突的依赖为jpush极光推送的,排除jpush的io.netty

  1. <dependency>
  2. <groupId>cn.jpush.api</groupId>
  3. <artifactId>jpush-client</artifactId>
  4. <version>3.2.17</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>io.netty</groupId>
  8. <artifactId>netty-all</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

排除之后问题解决,正常启动项目。保险的情况下,建议都排除,然后引入一个高版本都可以使用的,高版本不一定会有redisson和jpush所需要的所有依赖

 

Maven默认处理策略

            举例:依赖A包含依赖B,依赖B包含依赖C,依赖C包含依赖D1      A->B->C->D1

                    依赖E包含依赖F,依赖F包含依赖D2                E->F->D2

                    D1和D2同样的JAR,版本不一样,旧的版本可能没有新版本的方法。就会报java.lang.ClassNotFoundException等

        最短路径优先

            Maven 面对 D1 和 D2 时,会默认选择最短路径的那个 jar 包,即 D2。E->F->D2 比 A->B->C->D1 路径短 1。

        最先声明优先

            如果路径一样的话,如: A->B->C1, E->F->C2 ,两个依赖路径长度都是 2,那么就选择最先声明。

 

按照maven默认策略,依赖路径浅的优先,先声明redisson

最后的解决办法

  1. <!--netty Jar包冲突,保证redisson依赖在jpush maven加载顺序之上,否则jpush会覆盖redisson的netty jar,导致jar冲突-->
  2. <dependency>
  3. <groupId>org.redisson</groupId>
  4. <artifactId>redisson</artifactId>
  5. <version>3.8.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>cn.jpush.api</groupId>
  9. <artifactId>jpush-client</artifactId>
  10. <version>3.2.17</version>
  11. <!-- <exclusions>-->
  12. <!-- <exclusion>-->
  13. <!-- <groupId>io.netty</groupId>-->
  14. <!-- <artifactId>netty-all</artifactId>-->
  15. <!-- </exclusion>-->
  16. <!-- </exclusions>-->
  17. </dependency>

正常启动成功

 

补充:当使用最后一种方式的时候,在linux环境下还是冲突,最后还是采取排除依赖

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号