错误日志:
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava/lang/Object;)V
at io.grpc.Metadata$Key.validateName(Metadata.java:628)
at io.grpc.Metadata$Key.<init>(Metadata.java:636)
at io.grpc.Metadata$Key.<init>(Metadata.java:566)
at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:740)
at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:735)
at io.grpc.Metadata$Key.of(Metadata.java:592)
at io.grpc.Metadata$Key.of(Metadata.java:588)
at io.grpc.internal.GrpcUtil.<clinit>(GrpcUtil.java:84)
at io.grpc.internal.AbstractManagedChannelImplBuilder.<clinit>(AbstractManagedChannelImplBuilder.java:83)
at com.sugon.transport.datain.TransportLogin.login(TransportLogin.java:22)
at datain.TransportBulkInsertCase.bigBulkInsert(TransportBulkInsertCase.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:696)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:882)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1189)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:348)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305)
at org.testng.SuiteRunner.run(SuiteRunner.java:254)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.ru
问题分析
错误出现在com.google.common.base.Preconditions.checkArgument这个方法中,网上查了相关资料,了解到应该是某些包的依赖有问题,那么我们需要从com.google.common.base.Preconditions.checkArgument开始找突破口,顺藤摸瓜找到实际出错的位置;
解决方法:
-
我们去搜com.google.common.base.Preconditions.checkArgument对应的jar包应该是com.google.guava,在maven中添加最新的依赖,启动,报错依旧;
-
利用IDEA的依赖检查功能(快捷键shift+ctrl+alt+u),轻松找到冲突的依赖,在图中标红的部分为jar包重复的,右键选择Exclude删除掉不需要的依赖,大部分代码的相关错误到这一步基本就都能解决;
-
上一步完成后,发现问题依旧存在,我们在VM options配置中,增加-XX: +TraceClassLoading参数,保存,重启应用,就能监控看到整个程序类加载的过程,上一步完成后,发现问题依旧存在,我们在VM options配置中,增加-XX: +TraceClassLoading参数,保存,重启应用,就能监控看到整个程序类加载的过程,根据加载过程,判断哪个jar包有问题;
-
根据第三步查看的过程,在本代码中,即便是重新引入了最新的com.google.guava,在加载的过程中还是会去找其他XXX.jar中的guava,XXX.jar是自己开发写的数据接入jar包,那么就理清楚了,需要解决的就是升级xxx.jar中的guava;
-
尝试在maven中对xxx.jar使用exclusion屏蔽掉guava,结果发现依然不能解决问题,遂采用简单暴力的办法,解压缩guava,把里面的文件拷贝出来覆盖原xxx.jar的文件,重启应用,运行成功!