使用带有java和scala的protobufs的问题

时间:2011-11-25 07:10:14

标签: java scala protocol-buffers

我有一个文件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所在的当前路径有prot / prot库的com / google / protobuf / * .class。

我再次发出了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类给出了相同的错误。

任何想法该怎么做??

答案

好。谢谢大家。

主要问题是来自谷歌的协议缓冲编译器包默认创建java库。我认为它确实安装了它。如果你正在运行Maven,它确实会这样做。但我没有maven

所以我在/java/src中编译了代码并使用了jar。                                        ^

5 个答案:

答案 0 :(得分:6)

编译时,需要在类路径上使用protobuf lib。所有缺少的包和类都来自protobuf lib。

查找protobuf jar并使用

javac -cp path/to/protobuf.jar xxx.java

答案 1 :(得分:2)

你是Java的新手,对吧?

缺少的是protobuf的java库文件(扩展名.jar)。它必须位于java编译器和java运行时的“类路径”中。 protoc生成你的类,但它取决于protobuf库。

javac xxx.java -cp PATH_TO_PROTOBUF/protobuf-java-2.3.0.jar

在运行时

java mypackage.MyMain -cp PATH_TO_PROTOBUF/protobuf-java-2.3.0.jar

答案 2 :(得分:1)

您可能需要使用protobuf套件的2.4.1版(或至少2.4+版),包括以确保更新protoc(protobuf编译器)使用新的protoc重新编译你的proto定义。 (换句话说,一切都必须是相同的版本:

  • protobuf-vn.n.n.jar文件;
  • protoc编译器;和
  • 用protoc。
  • 编译.proto文件的输出

我得到了一切,我开始向前推进一个我正在看的Clojure项目。您可能遇到了相同的版本偏斜问题。

答案 3 :(得分:0)

  

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 :(得分:0)

可以使用ubuntu a

安装protobuf jar文件
apt-get install libprotobuf-java

这将复制/ usr / share / java /

下的protobuf-java-2.4.1.jar

希望这有帮助