限贴下代码
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
问题点找到了,第一眼看到这种错误就差不多是jar报冲突,因为报在netty,在引入redisson的时候会自动引入netty,因为redisson基于netty的。
然后在idea查看jar下解决,步骤
项目maven栏右击项目查看jar
查看依赖关系图,找到冲突的依赖为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环境下还是冲突,最后还是采取排除依赖