Invalid embedded descriptor for ".proto".Dependencies passed (Protobufer)解决办法
前言
之前开发的时候,发现居然出现了Dependencies passed to FileDescriptor.buildFrom() don't match those listed in the FileDescriptorProto.的错误,还有Protocol Buffers Invalid embedded descriptor problem等错误,上网google了很久也没找到解决方法,最终经过设断点找官方文档,才把问题解决了。然后分享下解决问题的方法和过程。
一、找到出现bug的原因
看到报错了之后,就去设断点,用debug模式,弄明白为什么会出问题,通过设断点知道if (!dependencies[i].getName().equals(proto.getDependency(i))) {这里出现问题了,原因是两个地方的依赖不一样,这个涉及到proto文件的命名空间Package,import引入的文件,生成的java包路径等问题。因为两个值不相等,所以找到问题的原因所在,然后去看了自己的proto文件。一个是这样的:
import "descriptor.proto";
package com.pwrd.zs; extend google.protobuf.MessageOptions {
optional int32 msgid = 54321;
}
另一个是谷歌的descriptor.proto文件,由于这个文件的import和package没有正确使用,所以有问题,会报错!
package google.protobuf;
option java_package = "com.google.protobuf";
option java_outer_classname = "DescriptorProtos";
二、解决问题
1、java包路径和proto文件的命名空间。只要统一两边的依赖和命名空间以及正确设置好java包路径即可,在proto文件中,如果存在package声明无java_package声明,则说明该proto文件所在命名空间和生成的java包路径是一样的,如果有java_package则这个声明的为生成的java包路径,pacakge则只表示proto文件的命名空间,不表示java包路径!
2、两个文件的依赖关系(import)。即import引用的文件代表依赖关系,且import引用的要在对应的命名空间里引用,比如两个文件都在同个目录下,可以直接引用import "descriptor.proto",但是由于第一个文件的package命名空间是在google.protobuf里面,所以实际上是引用不到的,这样就会出问题,只要将descriptor.proto文件放在其google文件夹下的protobuf的文件夹下即可,然后import “google/protobuf/descriptor.proto”,这样就解决了第二个问题!
最后结果如下:
import "google/protobuf/descriptor.proto"; option java_package = "com.pwrd.zs.common.msg";
option java_outer_classname = "Options"; extend google.protobuf.MessageOptions {
optional int32 msgid = 54321;
}
三、总结
由于历史遗留下的问题,将两个proto放在同个目录下,然后package不一致出现了错误,没有正确理解package命名空间和import的概念及对应的生成的java包路径,造成了一些问题,实际上理解了之后还是很简单的。以后要吸取教训。
全文完。。。。
Invalid embedded descriptor for ".proto".Dependencies passed (Protobufer)解决办法的更多相关文章
- Attribute name invalid for tag form according to TLD异常解决办法_gaigai_百度空间
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- PHP:Invalid argument supplied for foreach()错误原因及解决办法
在php中使用foreach循环遍历时报Invalid argument supplied for foreach()错误,是因为循环的数据不是一个有效的数组. 因此我们只要在foreach之前判断一 ...
- Flutter Resolving dependencies...很慢解决办法
昨天打开AS,看到提示更新,就手贱的点了,结果更新到3.5版本后flutter的一些插件用不了了... 没办法,只能卸载,重新装回以前的版本,什么SDK.AVD的都重新装了 全都装好后,重新运行项目的 ...
- 【错误】mysql 出现 "1067 - Invalid default value for 'UPDATE_TIME' " 错误提示的解决办法
今天工作中遇到修改表结构的时候出现错误 Invalid default value for 'UPDATE_TIME 问题原因是因为db 表中update_time的默认时间写成了 '0000-00- ...
- Error: error getting chaincode bytes: failed to calculate dependencies报错解决办法
Error: error getting chaincode bytes: failed to calculate dependencies: incomplete package: github.c ...
- uwsgi出现invalid request block size: 21573 (max 4096)...skip解决办法
buffer-size uwsgi内部解析的数据包大小,默认4k. 如果准备接收大请求,你可以增长到64k. 允许uwsgi接收到32k,更大的会被丢弃. xweb.ini [uwsgi]socket ...
- [JAVA] IOException: Invalid byte 2 of 2-byte UTF-8 sequence(解决办法)
日志打印不全,后台只打印出出标题的异常信息: 先前的日志打印信息:log.debug(e.getMessage()); 后面改成了日志打印信息:log.debug(e); log.debug(e.ge ...
- SQLYog执行SQL脚本提示:错误代码: 1067 - Invalid default value for '数据库表'查询:解决办法
强烈建议:完全卸载当前版本MySQL,重新安装5.6及以上版本 完全卸载方法:https://jingyan.baidu.com/article/3d69c551611290f0ce02d77b.ht ...
- centos6 rpm安装mysql(5.5版本)包括 error : Failed dependencies:libaio的解决办法.
1.先在/opt目录下放了两个rpm包 2.先看系统中是否有其他版本的mysql的rpm包 rpm -qa | grep -i mysql 命令结果如下图: 如果没有此步跳过,否则执行一下命令将其删除 ...
随机推荐
- 基于visual Studio2013解决C语言竞赛题之1041反向打印
题目 解决代码及点评 /* 功能:将一个整数(最多是10位数)从低位到高位打印出来, 如该数是12345时,输出应是54321(只占一行) 时间:19:18 201 ...
- Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity ...
- php连接oracle及简单操作
使你的php支持oracle,按照以下步骤即可: 1.安装php环境,找一下appserv或者xampp,一键安装,很方便 2.把php的ext目录下的php_oci8.dll拷到system32目录 ...
- POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*
感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...
- Jquery文本框小例(必填框)
<script src="../JavaScript/jquery-2.0.2.min.js"></script> <script type=&quo ...
- Linq To sql入门练习 Lambda表达式基础
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- linux环境: shell初始化文件, for TCSH, CSH
TCSHELL, CSHELL 配置文件 全局配置文件 /etc/csh.cshrc个人配置文件 ~/.cshrc或~/.tcshrc 参考: 1.配置你的csh/tcsh, https://wik ...
- XML文件解析之--DOM与SAX
xml文件又称‘可扩展性标记语言’,可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发. 我们在进行web开发的时候离不开xml文件,xml ...
- 重操JS旧业第七弹:面向对象与对象创建
JS是一种完全面向对象的程序设计语言,在面向对象处理方面,具有多种多样的实现方式,加之对象成员的动态性使得这门语言更加灵活:而js对象成员动态性也是创建和扩展对象的有力方式. 1 对象成员动态性 属性 ...
- 重操JS旧业第三弹:Array
数组在任何编程语言中都是非常重要的,因为函数在最大程度上代表了要实现的功能,而数组则是这些函数所要操作的内存一部分. 1 构建数组 js与其他非脚本语言的灵活之处在于要实现一个目标它可能具有多种方式, ...