2012-07-28 7 views
7

Si obtiene errores de compilación como estos al usar protobufs con java, observe a continuación.El código de Protobuf java tiene errores de compilación

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

El archivo README realmente no podría haber sido más claro: * Todavía tendrá que descargar el paquete de código fuente para obtener las bibliotecas de tiempo de ejecución de Java o Python . Obtenlo de: https://github.com/google/protobuf/releases/* –

Respuesta

31

Ok, el llamado Java tutorial para protobufs en realidad no menciona cómo conseguir la biblioteca protobuf en su proyecto. Implica que todo el código está en su único archivo .java generado, que en realidad sería bastante agradable, pero ese no es el caso.

Observe la fuente y verá referencias a com.google.protobuf, que puede encontrar en el directorio java/src/main/java en la fuente de protobuf. Sin embargo, copie eso en su proyecto y tendrá errores de compilación.

La solución está en el archivo README.txt. Sí, tal vez debería haberlo leído, pero ¿no debería estar toda la información que necesita para comenzar en el tutorial de inicio? De todos modos, hacer esto:

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

Y entonces copiar los archivos de Java en su proyecto.

+0

Esto me ayudó mucho. ¡Gracias! –

+0

@Timmmm: Esto ayudó ... gracias ..Pero de todos modos, simplemente no podía entender el significado del comando "protoc --java_out = src/main/java -I ../ src ../src/google/protobuf/descriptor.proto" aunque tengo una idea vaga ¿Entonces puedes explicarlo claramente? –

+0

@aarish run protocth -h. -I es el directorio para buscar importaciones, --java_out es el directorio en el que colocar los archivos fuente generados y el último argumento es el archivo proto para compilar – doc

0

Otra opción es editar el pom.xml incluido en la fuente. Puede cambiarlo para compilar los archivos proto en el ciclo de vida de validación y escribirlos en el directorio de origen.

Aplicar esta diff o similar (o crear un nuevo perfil de acumulación):

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

Ahora, sólo puede funcionar mvn validate y todos los archivos proto serán compilados en la fuente de su proyecto :)

0

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

Instalación - sin Maven

Si usted no desea instalar Maven para construir la biblioteca, y Puede seguir estas instrucciones en su lugar. Tenga en cuenta que estas instrucciones omiten las pruebas unitarias en ejecución y solo describe cómo instalar la biblioteca core protobuf (sin el paquete util).

1) Cree el código C++ u obtenga una distribución binaria de protocolos. Si instala una distribución binaria, asegúrese de que sea la misma versión que este paquete. En caso de duda, ejecute:

$ protoc --version Si creó el código C++ sin instalar, el compilador binario se debe ubicar en ../src.

2) Invocar protoc para construir DescriptorProtos.java:

$ protoc --java_out = núcleo/src/main/java -I ../ src \ ../src/google/protobuf/descriptor. proto 3) Compile el código en core/src/main/java usando el medio que prefiera.

4) Instale las clases donde lo prefiera.

Cuestiones relacionadas