记一次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 ...
随机推荐
- centos7证书安全登录
生成一对密钥,本地私钥匹配线上主机的公钥进行登录,比密码登录更加安全方便. 本文适用MAC/Linux的本地环境 1.本地生成一对密钥 ssh-keygen -t rsa 2.把生成的公钥上传到线上主 ...
- JavaScript数组(二)实例
一.Js 数组示例常用操作. $(function () { Javascript数组学习 var nums = new Array([10], [5],[ 8], [2], [3]); 数组反转 n ...
- curl命令转换成php源码
curl命令转换成php源码 获取状态: curl -X GET -H "Content-Type:application/json" -H "Authorization ...
- linux 命令之 dmidecode
Dmidecode 这款软件同意你在 Linux 系统下获取有关硬件方面的信息.Dmidecode 遵循 SMBIOS/DMI 标准.其输出的信息包含 BIOS.系统.主板.处理器.内存.缓存等等. ...
- 关于安装 Microsoft Office
安装 Microsoft Office 道路可谓漫漫…… 学校信息网络中心提供的“正版Office”安装了好几次都没成功…… [关于安装包和安装] 看了这篇经验,还不错: office2018官方下 ...
- centos mysql密码忘记了如何修改
# /etc/init.d/mysql stop# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &# mysq ...
- 这些APP开发技巧可少花60万!
用户需求——我偏不用干嘛要装? 随着手机的普及,大众流量的端口从电脑转移到手机,传统的商业平台从线下到电脑再到手机进行了转换.手机APP作为移动互联网的入口,众多创业者凭借一个手机APP成就了亿万财富 ...
- HighLight.js 使用Demo
复制下面代码,保存为html,浏览器打开预览即可. <!DOCTYPE html> <html> <head> <meta charset="utf ...
- 设置DataGridView不自动创建生成列
DataGridView.AutoGenerateColumns 获取或设置一个值,该值指示是否为数据源中的每一字段自动创建 BoundColumn 对象并在 DataGrid 控件中显示这些对象. ...
- redmine在linux上的mysql性能优化方法与问题排查方案
iredmine的linux服务器mysql性能优化方法与问题排查方案 问题定位: 客户端工具: 1. 浏览器inspect-tool的network timing工具分析 2. 浏览 ...