限贴下代码

package com.shinedata.util.redis;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ClassName RedissonConfig
 * @Author yupanpan
 * @Date 2019/10/21 9:27
 */
@Configuration
public class RedissonConfig {

    private static final Logger logger = LoggerFactory.getLogger(RedissonConfig.class);

    @Bean
    public RedissonClient redissonClient(){
        RedissonClient redisson = null;
        try {
            Config config = new Config();
            String redisUrl = String.format("redis://%s:%s","xxxxxxx","6379");
            config.useSingleServer().setAddress(redisUrl).setPassword("artstep!@#$%QWERT");
            redisson = Redisson.create(config);
        }catch (Exception e){
            logger.error("初始化redisson失败",e);
            e.printStackTrace();
        }
        return redisson;
    }
}

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

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

redisson包 redisson包和redis冲突_redis

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

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

redisson包 redisson包和redis冲突_jar_02

 项目maven栏右击项目查看jar

redisson包 redisson包和redis冲突_jar_03

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

<dependency>
            <groupId>cn.jpush.api</groupId>
            <artifactId>jpush-client</artifactId>
            <version>3.2.17</version>
            <exclusions>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-all</artifactId>
                </exclusion>
            </exclusions>
        </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

最后的解决办法

<!--netty Jar包冲突,保证redisson依赖在jpush maven加载顺序之上,否则jpush会覆盖redisson的netty jar,导致jar冲突-->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.8.2</version>
        </dependency>
        <dependency>
            <groupId>cn.jpush.api</groupId>
            <artifactId>jpush-client</artifactId>
            <version>3.2.17</version>
<!--            <exclusions>-->
<!--                <exclusion>-->
<!--                    <groupId>io.netty</groupId>-->
<!--                    <artifactId>netty-all</artifactId>-->
<!--                </exclusion>-->
<!--            </exclusions>-->
        </dependency>

正常启动成功

 

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