项目一直使用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使用报错排查的更多相关文章

  1. .net core中Grpc使用报错:The remote certificate is invalid according to the validation procedure.

    因为Grpc采用HTTP/2作为通信协议,默认采用LTS/SSL加密方式传输,比如使用.net core启动一个服务端(被调用方)时: public static IHostBuilder Creat ...

  2. .net core中Grpc使用报错:The response ended prematurely.

    当我们调用Grpc是出现下面的一堆异常时,一般是由于LTS导致的: Call failed with gRPC error status. Status code: 'Unavailable', Me ...

  3. .net core中Grpc使用报错:Request protocol 'HTTP/1.1' is not supported.

    显然这个报错是说HTTP/1.1不支持. 首先,我们要知道,Grpc是Google开源的,跨语言的,高性能的远程过程调用框架,它是以HTTP/2作为通信协议的,所以当我启动启用一个服务作为Grpc的服 ...

  4. adb驱动安装和使用报错笔记

    adb驱动安装 adb驱动下载地址:https://adb.clockworkmod.com/ 安装时候选择一个容易记住的路径,这个很重要,因为adb驱动没有自动配置环境变量,所以实验时候将adb安装 ...

  5. animate is not a function(zepto 使用报错)[转]

    animate is not a function(zepto 使用报错) 1.为什么使用zepto写animate报错? 因为zepto默认构建包含: Core, Ajax, Event, Form ...

  6. 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 ...

  7. yum源使用报错

    CentOS系统yum源使用报错:Error: Cannot retrieve repository metadata (repomd.xml) for repository: rpmforge. 服 ...

  8. 2019-9-9:渗透测试,docker下载dvwa,使用报错型sql注入dvwa

    docker下载dvwa镜像,报错型注入dvwa,low级 一,安装并配置docker 1,更新源,apt-get update && apt-get upgrade &&am ...

  9. VirtualBox使用报错

    VirtualBox使用报错 1.启动报错:Failed to instantiate CLSID_VirtualBox... 报错内容: Failed to instantiate CLSID_Vi ...

随机推荐

  1. 广告行业中常说的 CPC,CPM,CPD,CPT,CPA,CPS 等词的意思是什么?

    广告投放流程主要分为展示和转化,CPC/CPM/CPD/CPT/CPA/CPS等代表的是不同的结算模式 展示端的结算方式有: CPM(Cost Per Mille) 每千人成本:只要向足够量级的用户展 ...

  2. 中国大学MOOC-陈越、何钦铭-数据结构-2017春

    中国大学MOOC-陈越.何钦铭-数据结构-2017春 学习地址 详细学习内容 Github记录地址 欢迎fork和star,有惊喜值得学习! 参考学习笔记 参考AC代码 数据结构和算法学习笔记 学习内 ...

  3. Xposed 框架 hook 简介 原理 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. SpringBoot+SpringDataJPA项目中使用EntityManager执行自定义复杂SQL的方法

    import javax.annotation.Resource; import javax.persistence.EntityManager; @Resource private EntityMa ...

  5. angular 2 - 002 - 基本概念和使用

    service的注入, 注入的是service的单一实例

  6. 市场风险~VaR的概述

    1.概念理解 VaR的含义:Value at Risk 按字面的解释就是"处于风险状态的价值",可译为受险价值.在险价值.风险价值等. 通常解释为:VaR是在一定置信水平和一定持有 ...

  7. 批量备份数据库脚本(PowerShell版)

    开始 昨天备份一个数据库拿来测试,发现备份后的文件非常大.后来去检查下使用的备份脚本,原来之前的备份脚本没有压缩功能. 现把之前的备份脚本修改下,支持压缩备份,和支持仅复制备份(CopyOnly). ...

  8. PHPStorm + Homestead + Xdebug + Chrome Xdebug Helper 调试配置

    话说 PHPStorm 写起代码来非常带感,各种提示补全和纠错,以及在 L5 中的命名空间功能更是强大到感动(新建类自动添加命名空间,自动引入命名空间,返回参数命名空间纠正等等).当然它的调试功能更是 ...

  9. grokking deep learning

    https://www.manning.com/books/grokking-deep-learning?a_aid=grokkingdl&a_bid=32715258

  10. python conv2d scipy卷积运算

    scipy的signal模块经常用于信号处理,卷积.傅里叶变换.各种滤波.差值算法等. *两个一维信号卷积 >>> import numpy as np >>> x ...