使用Java和Scala时使用protobufs时出现的问题

7

我有一个文件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文件。然后我解压缩了它们。现在我的当前路径,即xxx.java所在的路径,有protobuf库的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类产生了相同的错误。
有任何想法该怎么办吗? 答案 好的,谢谢大家。
主要问题在于来自Google的协议缓冲区编译器包默认情况下不创建Java库。我认为它会创建并安装它。实际上,如果您正在运行Maven,它确实会这样做。但是我没有Maven。
因此,我编译了/java/src中的代码并使用了jar。

1
你需要自己编译protobuf中的java子目录(通常使用Maven,因为有pom.xml文件),并在编译生成的Java源代码时使用生成的jar文件。或者你可以直接下载jar文件,例如从Maven仓库(http://mvnrepository.com/artifact/com.google.protobuf/protobuf-java,点击Binary)。 - Peter Štibraný
4个回答

7

编译时,需要在类路径中添加protobuf库。所有缺失的包和类都来自于protobuf库。

找到protobuf jar并使用。

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

是的,我刚刚做了。我把protobuf jar包放在同一个目录下,它显示了上面第二组错误“找不到符号”.....第一组错误已经消失了。 - Aditya Singh

1

您可能需要使用版本2.4.1(或2.4+,至少)的protobuf工具包,包括确保您更新了protoc(protobuf编译器)并且使用新的protoc重新编译您的proto定义。(换句话说,所有内容必须是相同的版本:

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

一旦我将所有内容同步,我就开始着手处理我正在研究的Clojure项目。您可能会遇到相同的版本不匹配问题。


0

-1

可以使用Ubuntu来安装protobuf jar文件

apt-get install libprotobuf-java

这将会把 protobuf-java-2.4.1.jar 复制到 /usr/share/java/ 目录下

希望这能有所帮助


官方发行版下载链接:https://developers.google.com/protocol-buffers/docs/downloads - Pramit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接