在 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 的问题的主要内容,如果未能解决你的问题,请参考以下文章

scala在Java中调用scala方法

scala在Java中调用scala方法

初学Scala和 Java的一些区别

Scala 中 Seq 和 List 的区别

Java 和 Scala 中 C# 的访问修饰符的等价物是啥?

使用Java和Scala在IDE中开发DataFrame实战