2012-07-28 7 views
7

Jeśli otrzymasz takie błędy kompilacji podczas korzystania z protobufs z java, spójrz poniżej.Kod Javy Protobuf ma błędy kompilacji

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

Program README naprawdę nie mógł uczynić go bardziej zrozumiałym: * Będziesz musiał pobrać pakiet kodu źródłowego, aby uzyskać biblioteki wykonawcze Java lub Python . Uzyskaj od: https://github.com/google/protobuf/releases/* –

Odpowiedz

31

Ok, tzw Java tutorial dla protobufs faktycznie nie wspominając, jak dostać się do biblioteki Protobuf do projektu. Oznacza to, że kod ten znajduje się w pojedynczym wygenerowanym pliku .java, co byłoby całkiem miłe, ale tak nie jest.

Spójrz na źródło, a zobaczysz odniesienia do com.google.protobuf, które można znaleźć w katalogu java/src/main/java w źródle protobuf. Skopiuj go do swojego projektu i będzie on zawierał błędy konstrukcyjne.

Rozwiązanie znajduje się w pliku README.txt. Tak, może powinienem był to przeczytać, ale czy wszystkie informacje, których potrzebujesz, aby zacząć, nie powinny znaleźć się w samouczku dla początkujących? W każdym razie, to zrobić:

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

I następnie skopiować pliki java do projektu.

+0

Bardzo mi to pomogło. Dzięki! –

+0

@Timmmm: Pomogło .. dzięki ..W każdym razie nie mogłem zrozumieć znaczenia polecenia "protoc - ajava_out = src/main/java -I ../ src ../src/google/protobuf/descriptor.proto", chociaż mam niejasny pomysł .. Więc możesz jasno wyjaśnić? –

+0

@arish run protoc -h. -I jest katalogiem do wyszukiwania importów, --java_out to katalog, w którym umieszczane są wygenerowane pliki źródłowe, a ostatni argument jest plikiem proto do kompilacji – doc

0

Inną opcją jest edycja pom.xml zawartej w źródle. Możesz go zmienić, aby skompilować pliki proto podczas sprawdzania poprawności cyklu życia i zapisać je w katalogu źródłowym.

Zastosuj ten diff lub podobne (lub utworzyć nowy profil build):

$ 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" /> 

Teraz można po prostu uruchomić mvn validate i wszystkie pliki proto zostaną skompilowane do źródła projektu :)

0

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

Instalacja - Bez maven

Jeśli wolisz nie instalować maven zbudować bibliotekę, y Zamiast tego możesz postępować zgodnie z tymi instrukcjami. Zauważ, że te instrukcje pomijają testy jednostkowe i opisują tylko jak zainstalować rdzeń biblioteki protobuf (bez pakietu util).

1) Zbuduj kod C++ lub uzyskaj binarną dystrybucję protokołu. Jeśli instalujesz dystrybucję binarną, upewnij się, że jest to ta sama wersja, co ten pakiet. W razie wątpliwości uruchom:

$ protoc --version Jeśli zbudowałeś kod C++ bez instalowania, plik binarny kompilatora powinien znajdować się w pliku ../src.

2) Wywołanie protoc zbudować DescriptorProtos.java:

$ protoc --java_out = rdzeń/src/main/java -I ../ src \ ../src/google/protobuf/descriptor. proto 3) Skompiluj kod w core/src/main/java używając dowolnych środków.

4) Zainstaluj zajęcia w dowolnym miejscu.