在 java 和 scala 中使用 protobuf 的问题
Posted
技术标签:
【中文标题】在 java 和 scala 中使用 protobuf 的问题【英文标题】:Problems using protobufs with java and scala 【发布时间】:2011-11-25 07:10:14 【问题描述】:我有一个文件xxx.proto
。我下载了 protobuf 编译器并安装了它。然后我发出了这个命令
protoc --java_out=./ xxx.proto
它生成了我的 xxx.java
现在我想把这个文件编译成一个类文件,我可以在 Scala 中使用它。
javac xxx.java
这给了我这个错误
xxx.java:7: package com.google.protobuf does not exist
com.google.protobuf.ExtensionRegistry registry)
^
xxx.java:12450: package com.google.protobuf.Descriptors does not exist
private static com.google.protobuf.Descriptors.Descriptor
^
xxx.java:12453: package com.google.protobuf.GeneratedMessage does not exist
com.google.protobuf.GeneratedMessage.FieldAccessorTable
...
...
...
100 errors
现在我猜,它没有包装。
所以我将 com.google.protobuf 包的类文件复制到 xxx.java 所在的同一个文件夹中。注意 - 我没有编译这个包。我从另一个包含 jar 文件的扩展下载了 jar。所以我提取了它们。现在我 xxx.java 所在的当前路径有 com/google/protobuf/ *.class of protobuf 库。
我再次发出 javac 命令。
这次我遇到了一组不同的错误 -
xxx.java:10: cannot find symbol
symbol : class MessageOrBuilder
location: package com.google.protobuf
extends com.google.protobuf.MessageOrBuilder
^
xxx.java:215: cannot find symbol
symbol : class MessageOrBuilder
location: package com.google.protobuf
extends com.google.protobuf.MessageOrBuilder
^
xxx.java:608: cannot find symbol
symbol : class MessageOrBuilder
location: package com.google.protobuf
extends com.google.protobuf.MessageOrBuilder
^
xxx.java:1017: cannot find symbol
symbol : class MessageOrBuilder
location: package com.google.protobuf
extends com.google.protobuf.MessageOrBuilder
..... 100 errors
我什至尝试编译 google protobufs 附带的源文件。生成的 java 类给出了同样的错误。
有什么想法吗??
回答
好的。谢谢大家。
主要问题是谷歌的protocol buffers编译器包默认不创建java库。我认为它确实并安装了它。如果您正在运行 Maven,它实际上会这样做。但是我没有maven
所以我在/java/src
中编译了代码并使用了jar。
^
【问题讨论】:
对了,你需要自己编译protobuf中的java子目录(一般使用Maven,因为有pom.xml文件),编译生成的java源码时使用生成的jar文件。或者您可以只下载 jar 文件,例如从 Maven 存储库(mvnrepository.com/artifact/com.google.protobuf/protobuf-java,单击 Binary)。 【参考方案1】:编译时,您的类路径中需要有 protobuf 库。所有那些缺少的包和类都来自 protobuf lib。
找到protobuf jar并使用
javac -cp path/to/protobuf.jar xxx.java
【讨论】:
是的,就是这么做的。我将 protobuf jar 放在同一目录中,它在“找不到符号”上方显示第二组错误.....第一个错误消失了。【参考方案2】:您可能需要使用 protobuf 工具包的 2.4.1(或至少 2.4+)版本,包括确保您更新了 protoc(protobuf 编译器)和 em> 使用新的 protoc 重新编译您的 proto 定义。 (换句话说,一切都必须是相同的版本:
protobuf-vn.n.n.jar 文件; 协议编译器;和 使用 protoc 编译 .proto 文件的输出。我让一切都同步了,我开始着手处理我正在研究的 Clojure 项目。您可能会遇到相同的版本倾斜问题。
【讨论】:
【参考方案3】:protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
您可以从>>下载 protoc.exe(新版本)。
https://code.google.com/p/protobuf/downloads/detail?name=protoc-2.5.0-win32.zip&can=2&q=
在你的 *.proto 文件中你正确配置
option java_package = "com.example.package";
option java_outer_classname = "class name";
【讨论】:
【参考方案4】:可以使用 ubuntu a 安装 protobuf jar 文件
apt-get install libprotobuf-java
这将复制/usr/share/java/下的protobuf-java-2.4.1.jar
希望对你有帮助
【讨论】:
官方发行版下载,developers.google.com/protocol-buffers/docs/downloads以上是关于在 java 和 scala 中使用 protobuf 的问题的主要内容,如果未能解决你的问题,请参考以下文章