记一次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 ...
随机推荐
- double compare 0
因为double类型或float类型都是有精度的,其实都是取的近似值,所以有个误差.和一个很小的数比如0.00000001(1e-8)比较就是为了在这个误差范围内进行比较. 举个例子如double b ...
- Redis接口的调用
1.hiredis是redis数据库的C接口,目录为/redis-3.2.6/deps/hiredis 2.示例代码如下: #include <stdio.h> #include < ...
- 解决Android Studio出现GC overhead limit exceeded
方法一: 修改项目目录下的gradle.properties,增加如下配置信息(红色文字中需要根据自己电脑的配置修改内存大小,其余的配置用于加快gradle的编译速度) org.gradle.daem ...
- MySQL之You can't specify target table for update in FROM clause解决办法
这篇文章主要介绍了mysql中You can't specify target table for update in FROM clause错误解决方法,需要的朋友可以参考下 MySQL中You c ...
- linux apache2部署php
apache2 doc http://blog.csdn.net/actor1999/article/details/44802519 #apache sudo apt-get install apa ...
- 数据分析:基于Python的自定义文件格式转换系统
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 一个网站SEO优化方案
首先,前端/页编人员主要负责站内优化,主要从四个方面入手: 第一个,站内结构优化 合理规划站点结构(1.扁平化结构 2.辅助导航.面包屑导航.次导航) 内容页结构设置(最新文章.推荐文章.热门文章.增 ...
- linux驱动(续)
网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解 目前支持I/O多路复用的系统调用有 select,psel ...
- 15.翻译系列:EF 6中的级联删除【EF 6 Code-First 系列】
原文链接:https://www.entityframeworktutorial.net/code-first/cascade-delete-in-code-first.aspx EF 6 Code- ...
- Android 看源码学 Binder
参考:https://jekton.github.io/2018/04/07/binder-why-RemoteListenerCallback-works/ 参考:https://jekton.gi ...