2012-07-28 108 views
7

如果在使用protobufs和java時遇到類似這樣的構建錯誤,請看下面。Protobuf java代碼有構建錯誤

The method getOptions() from the type Descriptors.Descriptor refers to the missing type MessageOptions 

The import com.google.protobuf.DescriptorProtos cannot be resolved 

FileDescriptorProto cannot be resolved to a type 
+0

自述文件確實無法使它更清晰:*您仍然需要下載源代碼包才能獲得 Java或Python運行時庫。獲取它: https://github.com/google/protobuf/releases/* – 2015-08-09 23:10:56

回答

31

好,爲protobufs所謂Java tutorial實際上並沒有提及如何讓protobuf的庫到您的項目。這意味着所有的代碼都在你的單個生成的.java文件中,這實際上是相當不錯的,但那不是大小寫。

查看源代碼,您將看到對com.google.protobuf的引用,您可以在protobuf源文件的java/src/main/java目錄中找到該引用。然後將它複製到你的項目中,並且它會產生錯誤。

該解決方案位於README.txt文件中。是的,也許我應該閱讀它,但是不是所有需要的信息都應該在入門教程中介紹?無論如何,這樣做:

# From the protobuf directory. 
cd java 
protoc --java_out=src/main/java -I../src ../src/google/protobuf/descriptor.proto 

而且然後 Java文件複製到您的項目。

+0

這幫了我很多。謝謝! – 2012-12-31 02:17:06

+0

@Timmmm:這有助於..謝謝..但無論如何,我只是無法理解命令「protoc --java_out = src/main/java -I ../ src ../src/google/protobuf/descriptor.proto」的含義,儘管我有一個模糊的想法..所以你可以清楚地解釋一下嗎? – 2014-01-03 10:27:22

+0

@aarish run protoc -h。 -I是搜索導入的目錄,--java_out是放置生成的源文件的目錄,最後一個參數是要從'README.md'目錄編譯 – doc 2014-12-02 12:54:33

0

另一種選擇是編輯源代碼中包含的pom.xml文件。您可以將其更改爲在驗證生命週期中編譯proto文件並將它們寫入源目錄。

應用此差異或同級(或創建一個新的建造輪廓):

$ diff -u ~/Downloads/protobuf-2.6.0/java/pom.xml pom.xml 
--- /c/Users/MYNAME/Downloads/protobuf-2.6.0/java/pom.xml  Mon Aug 25 20:52:36 2014 
+++ pom.xml  Tue Dec 2 13:51:56 2014 
@@ -74,12 +74,12 @@ 
     <executions> 
      <execution> 
      <id>generate-sources</id> 
-   <phase>generate-sources</phase> 
+   <phase>validate</phase> 
      <configuration> 
       <tasks> 
       <mkdir dir="target/generated-sources" /> 
-    <exec executable="../src/protoc"> 
-     <arg value="--java_out=target/generated-sources" /> 
+    <exec executable="protoc"> 
+     <arg value="--java_out=src/main/java" /> 
        <arg value="--proto_path=../src" /> 
        <arg value="../src/google/protobuf/descriptor.proto" /> 
       </exec> 
@@ -92,12 +92,12 @@ 
      </execution> 
      <execution> 
      <id>generate-test-sources</id> 
-   <phase>generate-test-sources</phase> 
+   <phase>validate</phase> 
      <configuration> 
       <tasks> 
       <mkdir dir="target/generated-test-sources" /> 
-    <exec executable="../src/protoc"> 
-     <arg value="--java_out=target/generated-test-sources" /> 
+    <exec executable="protoc"> 
+     <arg value="--java_out=src/test/java" /> 
        <arg value="--proto_path=../src" /> 
        <arg value="--proto_path=src/test/java" /> 
        <arg value="../src/google/protobuf/unittest.proto" /> 

現在,你可以只運行mvn validate和所有的原文件將被編譯到項目的源:)

0

https://github.com/google/protobuf/tree/master/java

安裝 - 沒有Maven的

如果你寧願不安裝Maven構建庫,Y您可以按照這些說明進行操作。請注意,這些指令將跳過運行單元測試,並僅介紹如何安裝核心protobuf庫(不包含util軟件包)。

1)構建C++代碼,或獲取protoc的二進制分發。如果您安裝二進制分發版,請確保它與此軟件包版本相同。如果有疑問,請運行:

$ protoc --version 如果您在不安裝的情況下構建C++代碼,則編譯器二進制文件應位於../src中。

2)調用protoc構建DescriptorProtos.java:

$ protoc --java_out =芯/ SRC /主/ JAVA -I ../ SRC \ ../src/google/protobuf/descriptor。原型 3)使用任何你喜歡的方式在core/src/main/java中編譯代碼。

4)根據您的喜好安裝類。