Protobuf,Jar冲突导致的请求异常

项目中使用了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")
    }

4 排除后调用正常!!

你可能感兴趣的:(Protobuf,Jar冲突导致的请求异常)