Protobuf,Jar冲突导致的请求异常
2020-06-20 本文已影响0人
VincentPeng
项目中使用了Grpc和阿里云日志
访问RPC接口突然显示,没有权限访问AbstractMessage.memoizedSize属性,让后查看了项目中的依赖,发现存在2.5.0和3.11.0两个版本的protobuf-java
java.lang.IllegalAccessError: class com.xxxx.xxx.xxx.api.xxxxxeParam tried to access private field com.google.protobuf.AbstractMessage.memoizedSize
问题点:
aliyun的日志使用了
排查这个问题其实没有花太多时间,主要在于确定是jar冲突这点上,应为使用的是gradle.kotlin 工程管理,开始打印项目依赖的时候显示没有使用2.5.0的jar包。就很矛盾,后来获取全局的依赖,才看到有了2.5.0的依赖
排查过程
1 确认问题是版本问题
多个依赖版本-
2.5.0版本中 protobuf-java中AbstractMessage.memoizedSize
2.5.0版本中memoizedSize是private
-
3.11.0版本中 protobuf-java中AbstractMessage.memoizedSize
3.11.0中memoizedSize是protected
2 查看完整项目依赖
查看项目依赖树:
#项目根路径下:输出依赖树到deplog.txt文件
gradle dependencies > deplog.txt
依赖树部分内容如下:
*号代表多版本;xx->xxx 标识版本覆盖3 排除低版本jar包
修改依赖:build.gradle.kts
implementation("com.aliyun.openservices:aliyun-log-log4j-appender:0.1.12"){
this.exclude("com.google.protobuf","protobuf-java")
}