2017-01-28 60 views
1

已尝试安装协议缓冲区编译器和Java运行时安装,但编译java类时出现错误。我下载:安装协议缓冲区时编译错误

  • protoc-3.2.0rc2-linux-x86_64.zip(虽然它说的版本是2.6.1)

  • protobuf-java-3.2.0rc2.zip

文件结构如下所示:

  • 项目/
    • protobuf_dir/
      • 的protobuf的文件/目录,包括SRC /和java/
      • SRC/
        • protoc(二进制)
        • protoc_dir /(其他的位和鲍勃从protoc zip文件)
      • 的java/
        • 核心/
        • 精简版/
        • ...

因此,假如这一切很好,我输入:

protoc --java_out=src/main/java -I../src \../src/google/protobuf/descriptor.proto 

所以protoc似乎工作正常。但后来我一直得到错误,像这样的,直到我评论出来(不知道这是一个问题吗?):

google/protobuf/descriptor.proto:443:3: Expected "required", "optional", or "repeated". 
google/protobuf/descriptor.proto:443:12: Expected field name. 
google/protobuf/descriptor.proto:541:3: Expected "required", "optional", or "repeated". 
google/protobuf/descriptor.proto:541:12: Expected field name. 

但当我尝试编译所有的java类,我刚得到一个错误说:

Descriptors.java:1175: error: cannot find symbol 
    return FieldDescriptorProto.Type.forNumber(ordinal() + 1); 

有关如何解决问题的任何想法?不明白为什么它不应该编译。尝试看谷歌的网页,但没有出现在这一点上。

意识到我听起来有点无知,尽管我从来没有真正使用过像Github的protobuf这样的库,所以这对我来说都是新的!

编辑:大家好,这个问题已解决完全相同的文件结构。我卸载了protoc2.6.1,设置了我的$ JAVA_HOME和$ PATH变量(您应该将它们存储起来,而不必每次都导出它们),安装maven(正确)。

一切都很好!一切编译顺利。感谢响应者!

+0

descriptor.proto是什么样子的? –

+0

@JoeC不太清楚你要求的是什么。该文件可以在此链接中找到(https://github.com/google/protobuf/blob/master/src/google/protobuf/descriptor.proto),如果这意味着什么,语法字段将设置为“proto2”。 –

回答

2

protoc-3.2.0rc2-linux-x86_64。zip(虽然它说版本是2.6.1)

这就是问题 - 你在某种程度上使用protoc 2.6.1而不是3.2.0。这可能是因为protoc 2.6.1已经安装在您的系统上,并且它以某种方式优先于3.2.0。如果您查看descriptor.proto中的错误,您会注意到它们发生在reserved关键字上,这是新的; 2.6.1不支持它。

使用与Java运行时库完全相同的protoc版本非常重要,否则生成的代码可能无法正确编译,也可能编译但无法正确运行。

+0

这很有道理!任何想法如何我可以删除2.6.1? –

+0

@DanielSoutar首先取决于你如何安装它。 :) –