记一次GRPC使用报错排查
项目一直使用grpc作为服务交互程序,其中我负责的java模块第一次引用该框架;当框架搭建好后,建立客户端代码,报错:
Runable Error:
java.lang.IllegalAccessError: tried to access field XXXXXXXXXXXXXXXXXXXXXX
at com.scut.fan.infrastructure.ftree.NewRequest$getMemoriedcount(.java:142)
首先我们看下该异常的信息:
package java.lang; /**
* Thrown if an application attempts to access or modify a field, or
* to call a method that it does not have access to.
* <p>
* Normally, this error is caught by the compiler; this error can
* only occur at run time if the definition of a class has
* incompatibly changed.
*
* @author unascribed
* @since 1.0
*/
public class IllegalAccessError extends IncompatibleClassChangeError {
private static final long serialVersionUID = -8988904074992417891L; /**
* Constructs an <code>IllegalAccessError</code> with no detail message.
*/
public IllegalAccessError() {
super();
} /**
* Constructs an <code>IllegalAccessError</code> with the specified
* detail message.
*
* @param s the detail message.
*/
public IllegalAccessError(String s) {
super(s);
}
}
通常我们定位问题最好的方法是先了解异常的javadoc,异常名称最能体现大方向,根据文档我们可以知道,当你没有权限访问一个field或者方法的时候,通常就会报这个异常,什么是没有权限呢?第一是修饰符问题,如果是protected,那么子类外不得引用;default修饰,那么包外不能引用;通常该类错误在编译时期就能被发现,如果是运行时期,那么通常是该类发生了不可兼容性的变更,那么我是否很顺利的修改完了Bug呢?
后来我去查看了GetMemoriedcount方法的类A,发现其中访问的memoriedcount成员变量就是定位错误的地方,也就是访问了该成员导致的illegalAcessError,而该成员是其A所继承的grpc框架级父类的成员,我进入该父类继续查看,发现该成员是Protected,没错啊,子类访问应该不会有问题,就算有问题,也是编译器报错,顿时我就开始苦恼;
可能性1—包冲突:
在网上看了很多方法,都说是包冲突,版本不对等等问题,其实深入到实质,包冲突也就是访问修饰符错误,因为有些包的版本就让你很崩溃,看个例子:ehcache-1.1.jar和ehcache-1.2.3.jar这两个包就有某个类同一字断不同访问修饰符的问题;
可能性2—内部类类加载:
也就是两个class文件,第一个A,第二个A$a;会导致价值不全的问题,我使用grpc在generalcode的时候也打包成单一问题,存在大部分内部类,所以我重新生产一次代码,这次我不用内部类,生成了几十个文件,可是最终依旧没解决问题,附加grpc不实用内部类的proto文件配置:
syntax = "proto3"; option java_multiple_files = true; //这里决定是否使用内部类编译成单个源文件
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";
可能性3—类加载器:
不同类加载器无法连调,我还没做过实验;但我把这两者的ClassLoader打印,都一样;
突破:
因为我使用的是Maven管理依赖,所以我突然想起,这样会导致一个很严重的问题,就是编译的时候你依赖的包存在就能编译通过,但是Maven管理后,同包,也就是包冲突的话Maven只会使用一个包,所以如果包冲突而Maven丢弃你编译依赖的包的话就可能报错,然后我马上建立新项目,仅依赖需要的包,而不是在旧项目的POM文件中使用,发现顺利进行了RPC,最好我花了好长时间才找到一个隐藏的WebLibrary下的一个GRPC包,去掉,解决问题;
这是我第二次被Maven搞死了,不过也不能管Maven的类解析机制,怪我维护的项目多个前辈,这依赖是在太乱了
记一次GRPC使用报错排查的更多相关文章
- .net core中Grpc使用报错:The remote certificate is invalid according to the validation procedure.
因为Grpc采用HTTP/2作为通信协议,默认采用LTS/SSL加密方式传输,比如使用.net core启动一个服务端(被调用方)时: public static IHostBuilder Creat ...
- .net core中Grpc使用报错:The response ended prematurely.
当我们调用Grpc是出现下面的一堆异常时,一般是由于LTS导致的: Call failed with gRPC error status. Status code: 'Unavailable', Me ...
- .net core中Grpc使用报错:Request protocol 'HTTP/1.1' is not supported.
显然这个报错是说HTTP/1.1不支持. 首先,我们要知道,Grpc是Google开源的,跨语言的,高性能的远程过程调用框架,它是以HTTP/2作为通信协议的,所以当我启动启用一个服务作为Grpc的服 ...
- adb驱动安装和使用报错笔记
adb驱动安装 adb驱动下载地址:https://adb.clockworkmod.com/ 安装时候选择一个容易记住的路径,这个很重要,因为adb驱动没有自动配置环境变量,所以实验时候将adb安装 ...
- animate is not a function(zepto 使用报错)[转]
animate is not a function(zepto 使用报错) 1.为什么使用zepto写animate报错? 因为zepto默认构建包含: Core, Ajax, Event, Form ...
- Windows下Git使用报错:warning:LF will be replaced by CRLF in ××××.××
Windows下Git使用报错: warning:LF will be replaced by CRLF in ××××.××(文件名) The file will have its original ...
- yum源使用报错
CentOS系统yum源使用报错:Error: Cannot retrieve repository metadata (repomd.xml) for repository: rpmforge. 服 ...
- 2019-9-9:渗透测试,docker下载dvwa,使用报错型sql注入dvwa
docker下载dvwa镜像,报错型注入dvwa,low级 一,安装并配置docker 1,更新源,apt-get update && apt-get upgrade &&am ...
- VirtualBox使用报错
VirtualBox使用报错 1.启动报错:Failed to instantiate CLSID_VirtualBox... 报错内容: Failed to instantiate CLSID_Vi ...
随机推荐
- 对指针和引用的理解(c++)
1.指针 typedef说明一种新类型名,来代替已有类型名. a.案例:typedef char* String_t和#define String_d char *这两句在使用上的区别? 1)前者声明 ...
- 根据javabean转换为mysql建表语句与mapper内容
原文地址: https://www.cnblogs.com/Jeffscnblog/p/10072483.html 一般上,我们会使用数据库表转换为javabean.dao.或是mapper,就叫逆 ...
- Spring Boot中使用Swagger2自动构建API文档
由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...
- python之使用set对列表去重,并保持列表原来顺序(转)
https://www.cnblogs.com/laowangball/p/8424432.html #原始方法,但是会打乱顺序 mylist = [1,2,2,2,2,3,3,3,4,4,4,4]m ...
- 【前端酷站】分享一个纯 Javascript 的图表库与立体像素风制作~
今天小编为大家推荐一个神奇的酷站.ECharts,一个纯 Javascript 的图表库. 以下是各个几个不错的界面的介绍: 首页:http://echarts.baidu.com/ 在首页有完整的说 ...
- iOS10使用SecKeyCreateWithData读取公钥私钥
在使用openssl命令生成RSA公钥私钥以后,当后端人员把密钥的字符串发给你: 首先要问清公钥私钥的密钥格式(PKCS1,PKCS8),密钥位数(1024,2048),然后在iOS10以后,使用苹果 ...
- bootstrap响应式前端页面
技术:HTML+CSS+JS+bootstrap 概述 这套代码响应式前端页面基本写完了,适合初学前端的同学,里面主要运用了HTML+CSS布局和动画,js逻辑较少,页面都是静态,未接入接口.响应 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- POSTMAN发送WebService接口
WebService是一种跨编程语言和跨操作系统平台的远程调用技术 http://www.oorsprong.org/websamples.countryinfo/countryinfoservice ...
- Atitit 分布式管理 vs 集中式管理
Atitit 分布式管理 vs 集中式管理 1. 集中式管理缺点 1 1.1. 单点故障 1 1.2. 没有灵活性 1 1.3. 打败vs 征服 参考 尼可罗·马基雅弗利编著的<君主论> ...