Android升级Gradle7.0.1使用gRPC插件时出现proto文件路径被遮蔽编译错误
问题解决方案
以下是三种可直接落地的解决方式,可根据你的项目实际需求选择:
- 优先推荐方案:移除重复依赖
你当前使用protobuf lite模式生成代码,io.grpc:grpc-protobuf-lite:1.40.1已经内置了lite版本的公共proto定义,不需要额外单独引入完整的protobuf-java依赖,直接删除如下行即可从根源避免重复文件冲突:
protobuf "com.google.protobuf:protobuf-java:3.17.3"
修改完成后执行./gradlew clean清除旧构建缓存,再重新打包即可正常编译。
- 方案二:调整proto路径优先级
如果你的项目确实需要保留protobuf-java依赖,可以手动指定protoc的proto路径搜索顺序,将被遮蔽的目录放到搜索顺序的最前面,修改你的generateProtoTasks配置块即可:
generateProtoTasks { all().each { task -> // 手动指定proto路径顺序,extracted-protos优先于extracted-include-protos task.protoPath = files( "${projectDir}/src/main/proto", "${buildDir}/extracted-protos/main", "${buildDir}/extracted-include-protos/${task.name.replace("generate", "").replace("Proto", "").toLowerCase()}" ) task.builtins { java { option 'lite' } } task.plugins { grpc { option 'lite' } } } }
- 方案三:过滤extracted-include-protos目录
如果你的项目完全不需要从第三方依赖中导入proto定义,可以直接过滤掉extracted-include-protos目录的输入,避免重复文件被扫描到:
generateProtoTasks { all().each { task -> // 过滤掉extracted-include-protos目录下的所有proto文件 task.inputs.files = task.inputs.files.filter { !it.path.contains("extracted-include-protos") } task.builtins { java { option 'lite' } } task.plugins { grpc { option 'lite' } } } }
注意:如果项目依赖了其他第三方库提供的proto定义,不要使用方案三,否则会出现找不到依赖proto的编译错误。
内容的提问来源于stack exchange,提问作者Phantom
相关产品推荐
相关产品推荐

