记一次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 ...
随机推荐
- 为什么大多公司不要培训班出来的JAVA程序员?
经常听到这样的观点:很多公司不招聘培训班出来的学生.甚至于让人感觉,如果你参加过培训,那简直就是你程序员职业生涯中的一大污点. 撸码J总结了这些公司不要培训班学生的理由: 一:简历造假 网上有大量的帖 ...
- python3 cookie
最近再次学习python,本来就是一个菜鸟,我按照 Python CGI编程 发现读cookie 读取不了,后来发现它这种写的方式也不怎么靠谱. Python中Cookie模块(python3中为ht ...
- OUTLOOK - Unable to Delete Meetings
Error Information: Resolved: Check Meeting room permission.Get-MailboxFolderPermission MeetingRoom_1 ...
- 【Java-JPA】让Springboot启动不检查JPA的数据源配置
#https://stackoverflow.com/questions/24074749/spring-boot-cannot-determine-embedded-database-driver- ...
- jquery动态添加元素无法触发绑定的事件的解决方案
方法一:绑定live事件(live事件只在jquery1.9以下才支持,高版本不支持). //jquery 1.9(不包括1.9)以下可以 $(".btn").live(" ...
- Centos7中ss命令安装
一.简述 一般Centos会自带ss这个命令,如果没带,则需要安装. 二.安装命令 yum install iproute
- 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)
本文是续 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境编写的. 本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,s ...
- [转]ThreadLocal使用
引言 ThreadLocal的官方API解释为: “该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线 ...
- nginx:not a directory
项目需要在nginx中提供一个配置文件返回接口的信息,于是就添加了location来实现,本以为很简单的操作,结果访问配置文件时一直返回404,nginx的error log中输出:not a dir ...
- 现代php编程
自动加载__autolaod和spl_autoload_register() 自动加载就是指如果找不到某个类如何处理的方式,具体可参见此文,可以说spl_autoload_register是更加高级, ...