一直在尝试安装 Protocol Buffers 编译器和 java 运行时安装,但在编译 java 类时遇到错误。我下载了:
protoc-3.2.0rc2-linux-x86_64.zip(虽然说版本是2.6.1)
protobuf-java-3.2.0rc2.zip
文件结构如下所示:
- 项目/
- protobuf_dir/
- protobuf 文件/目录,包括 src/和 java/
- src/
- 协议(protocol)(二进制)
- protoc_dir/(protoc zip 文件中的其他内容)
- java/
- 核心/
- 精简版/
- ...
- protobuf_dir/
假设一切正常,我输入:
protoc --java_out=src/main/java -I../src \../src/google/protobuf/descriptor.proto
所以 protoc 似乎工作正常。但后来我不断收到这样的错误,直到我将它们注释掉(不确定这是否是一个问题?):
google/protobuf/descriptor.proto:443:3: Expected "required", "optional", or "repeated".
google/protobuf/descriptor.proto:443:12: Expected field name.
google/protobuf/descriptor.proto:541:3: Expected "required", "optional", or "repeated".
google/protobuf/descriptor.proto:541:12: Expected field name.
但是当我尝试编译所有 java 类时,我总是收到一条错误消息:
Descriptors.java:1175: error: cannot find symbol
return FieldDescriptorProto.Type.forNumber(ordinal() + 1);
关于如何解决这个问题有什么想法吗?不明白为什么它不应该编译。尝试查看 Google 的页面,但没有任何结果。
意识到我听起来有点无能,尽管我以前从未真正使用过像 Github 上的 protobuf 这样的库,所以这对我来说是全新的!
编辑:大家好,这个问题已通过完全相同的文件结构解决。我卸载了 protoc2.6.1,设置了 $JAVA_HOME 和 $PATH 变量(你也应该存储它们,而不是每次都导出它们),安装了 maven(正确)。
一切都好!一切都编译顺利。感谢回复者!
最佳答案
protoc-3.2.0rc2-linux-x86_64.zip (although it says the version is 2.6.1)
这就是问题所在——您以某种方式使用协议(protocol) 2.6.1 而不是 3.2.0。这可能是因为 protoc 2.6.1 已安装在您的系统上,并且不知何故它优先于 3.2.0。如果您查看描述符.proto 中的错误,您会发现它们发生在 reserved
关键字上,该关键字是新的; 2.6.1不支持。
使用与 Java 运行时库完全相同版本的 protoc 非常重要,否则生成的代码可能无法正确编译,或者可能编译但无法正确运行。
关于java - 安装Protocol Buffers时出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41910741/