Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java和scala中使用protobufs时出现的问题_Java_Scala_Protocol Buffers - Fatal编程技术网

在java和scala中使用protobufs时出现的问题

在java和scala中使用protobufs时出现的问题,java,scala,protocol-buffers,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 re

我有一个文件
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所在的当前路径具有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的protocol buffers编译器包默认情况下不会创建java库。我假设它会这样做并安装它。如果您运行的是Maven,它实际上是这样的。但是我没有maven

因此,我在
/java/src
中编译了代码,并使用了jar。
^

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

找到protobuf jar并使用

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

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

  • protobuf-vn.n.n.jar文件
  • protoc编译器;以及
  • 使用protoc编译.proto文件的输出
一次我把所有东西都同步了,我开始着手我正在看的Clojure项目。你可能会遇到同样的版本倾斜问题

protoc-I=$SRC_DIR--java_out=$DST_DIR$SRC_DIR/addressbook.proto

您可以从>>下载protoc.exe(新版本)

在*.proto文件中,您可以正确配置

option java_package = "com.example.package";
option java_outer_classname = "class name";

可以使用ubuntu a安装protobuf jar文件

apt-get install libprotobuf-java
这将复制/usr/share/java下的protobuf-java-2.4.1.jar/


希望这有帮助。我把protobuf jar放在同一个目录中,它显示了上面“找不到符号”的第二组错误……第一组错误已经消失了。对,您需要自己在protobuf中编译java子目录(通常使用Maven,因为有pom.xml文件),并在编译生成的java源代码时使用生成的jar文件。或者,您可以只下载jar文件,例如从Maven repository(,单击Binary)。要下载该版本,