2017-01-28 62 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首先取決於你如何安裝它。 :) –