记录一次java.lang.NoSuchMethodError

错误日志:

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.(Metadata.java:636)
	at io.grpc.Metadata$Key.(Metadata.java:566)
	at io.grpc.Metadata$AsciiKey.(Metadata.java:740)
	at io.grpc.Metadata$AsciiKey.(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.(GrpcUtil.java:84)
	at io.grpc.internal.AbstractManagedChannelImplBuilder.(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开始找突破口,顺藤摸瓜找到实际出错的位置;

解决方法:

  1. 我们去搜com.google.common.base.Preconditions.checkArgument对应的jar包应该是com.google.guava,在maven中添加最新的依赖,启动,报错依旧;

  2. 利用IDEA的依赖检查功能(快捷键shift+ctrl+alt+u),轻松找到冲突的依赖,在图中标红的部分为jar包重复的,右键选择Exclude删除掉不需要的依赖,大部分代码的相关错误到这一步基本就都能解决;记录一次java.lang.NoSuchMethodError_第1张图片

  3. 上一步完成后,发现问题依旧存在,我们在VM options配置中,增加-XX: +TraceClassLoading参数,保存,重启应用,就能监控看到整个程序类加载的过程,上一步完成后,发现问题依旧存在,我们在VM options配置中,增加-XX: +TraceClassLoading参数,保存,重启应用,就能监控看到整个程序类加载的过程,根据加载过程,判断哪个jar包有问题;

  4. 根据第三步查看的过程,在本代码中,即便是重新引入了最新的com.google.guava,在加载的过程中还是会去找其他XXX.jar中的guava,XXX.jar是自己开发写的数据接入jar包,那么就理清楚了,需要解决的就是升级xxx.jar中的guava;

  5. 尝试在maven中对xxx.jar使用exclusion屏蔽掉guava,结果发现依然不能解决问题,遂采用简单暴力的办法,解压缩guava,把里面的文件拷贝出来覆盖原xxx.jar的文件,重启应用,运行成功!

你可能感兴趣的:(java)