问题背景
在做GRPC服务端的时候,不能启动,报错打印如下,但是并不能很好的看出是什么出错了,由于我单独测试的时候GRPC是可以使用的,但随着项目越来越复杂,引入的POM依赖越来越多,所以我开始从这之中查找原因
2022-01-25 11:01:39.896 ERROR [id-mapping-AsyncThread-1] o.s.a.i.SimpleAsyncUncaughtExceptionHandler.handleUncaughtException(SimpleAsyncUncaughtExceptionHandler.java:39): Unexpected exception occurred invoking async method: public void grpc.server.GrpcServer.start() throws java.io.IOException
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava/lang/Object;)V
at io.grpc.Metadata$Key.validateName(Metadata.java:629)
at io.grpc.Metadata$Key.<init>(Metadata.java:637)
at io.grpc.Metadata$Key.<init>(Metadata.java:567)
at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:742)
at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:737)
at io.grpc.Metadata$Key.of(Metadata.java:593)
at io.grpc.Metadata$Key.of(Metadata.java:589)
at io.grpc.internal.GrpcUtil.<clinit>(GrpcUtil.java:86)
at io.grpc.internal.AbstractServerImplBuilder.<clinit>(AbstractServerImplBuilder.java:60)
at io.grpc.netty.shaded.io.grpc.netty.NettyServerProvider.builderForPort(NettyServerProvider.java:39)
at io.grpc.netty.shaded.io.grpc.netty.NettyServerProvider.builderForPort(NettyServerProvider.java:24)
at io.grpc.ServerBuilder.forPort(ServerBuilder.java:41)
at server.Server.start(GrpcServer.java:30)
at grpc.server.GrpcServer$$FastClassBySpringCGLIB$$be87d0e.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
解决方案
1 通过去分析引入的jar包依赖,使用File→Setting安装Maven Dependency Helper依赖管理
2 安装之后,打开pom文件,点击Dependency Analyzer
3 选择Conflicts,点击Refresh UI进行刷新,可以看到出现了guava:18.0版本的,代表有和这个依赖有冲突了,就是重复引入了,
但引入一个问题,是排除哪一个重复的guava呢,这个问题也一直困扰着我,我的做法是先把显示的依赖排除,再继续编译尝试,不行的话,找到其他版本的guava进行排除
4 由于右键Conflicts中的guava没有出现排除选项,所以选择Jump to Left Tree显示更清楚
5 排除18版本,Reimport重新导入
6 点击Conflicts,发现没有冲突了
7 届时,也解决了GRPC服务端不能启动问题
总结
- 依赖兼容是一个大问题,同样的jar包,但是版本号不同,里面的一些类和注解也有变化,导致不兼容
- 使用Maven Dependency依赖插件去尝试排除冲突的包,可能会解决莫名其妙的问题
作为程序员第 34 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha ...
Lyric: 我好想再咬一口,ผมรักคุณ,ผมรักคุณ,ผมรักคุณ......
这是第1首歌,已经完结了,你们猜出歌名了吗?
- 歌名:麦芽糖
- 歌手:周杰伦
- 专辑:十一月的肖邦