2009-10-16 25 views
41

Estoy experimentando con Buffers de protocolo en un proyecto Maven 2 existente y bastante vainilla. Actualmente, invoco un script de shell cada vez que necesito actualizar mis fuentes generadas. Esto es obviamente una molestia, ya que me gustaría que las fuentes se generen automáticamente antes de cada compilación. Con suerte sin recurrir a hackers vergonzosos.Integrar búferes de protocolo en Maven2 compilación

Por lo tanto, mi pregunta es doble:

  1. Plano general: ¿hay una "Protocol Buffers plug-in" para Maven 2 que pueden lograr lo anterior de una manera automagic? Hay un branch on Google Code cuyo autor parece haber tomado la oportunidad de implementar dicho complemento. Desafortunadamente, es hasn't passed code review o se ha fusionado en el tronco de protobuf. El estado de ese complemento es desconocido.

  2. Probablemente más realista: al carecer de un complemento real, ¿de qué otra manera podría tratar al invocar protoc de mi compilación Maven 2? Supongo que puedo conectar mi script de shell existente en una invocación antrun o algo similar.

Las experiencias personales son muy apreciadas.

+0

Se trata de 7 años de edad pregunta, que en su mayoría ha anticuado respuestas (excepto uno). Las preguntas más nuevas están vinculadas. P.ej. http://stackoverflow.com/questions/40426366/automatically-generate-java-from-proto-with-maven-m2e-in-eclipse-ide y http://stackoverflow.com/questions/40575671/automatically-re- generated-source-update-on-edit-in-eclipse-with-maven-m2e –

Respuesta

43

Encontrará información sobre el complemento disponible en el repositorio de Protocolos de protocolo en el subproceso Protocol Buffers Compiler Maven Plug-In en el grupo de debate Protocolos de protocolo. Según tengo entendido, es utilizable pero le faltan pruebas. Yo lo probaría.

O usted podría utilizar el plugin antrun (snipet pegado desde el hilo mencionado anteriormente):

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
      <tasks> 
       <mkdir dir="target/generated-sources"/> 
       <exec executable="protoc"> 
       <arg value="--java_out=target/generated-sources"/> 
       <arg value="src/main/protobuf/test.proto"/> 
       </exec> 
      </tasks> 
      <sourceRoot>target/generated-sources</sourceRoot> 
      </configuration> 
      <goals> 
      <goal>run</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

<dependencies> 
    <dependency> 
    <groupId>com.google.protobuf</groupId> 
    <artifactId>protobuf-java</artifactId> 
    <version>2.0.3</version> 
    </dependency> 
</dependencies> 
+1

Discusión absolutamente fascinante, gracias por ese enlace. –

+1

Encontré esta respuesta satisfactoria, incluso para usar con los complementos de protobuf que no parecen ser compatibles con el complemento maven. Sin embargo, recomendaría no usar sourceRoot que está en desuso por http://maven.apache.org/plugins/maven-antrun-plugin/run-mojo.html#sourceRoot y confiar en build-helper-maven-plugin en su lugar (ver http://mojo.codehaus.org/build-helper-maven-plugin/usage.html). Esto fue necesario para que mi proyecto de protocolo y otros que dependen de él se comporten correctamente en m2eclipse. –

+0

@Thomas ¿podrías crear un pastie.org con el pom necesario para no usar sourceRoot? – TJR

0

Creo que el uso de antrun para invocar los pasos que no son de Maven es la solución generalmente aceptada.

También puede probar el maven-exec-plugin.

+0

Tengo dos problemas con el uso de 'antrun': (1) Su propósito declarado es facilitar la migración o la integración con Ant. Estoy tratando de lograr ninguno. Por lo tanto, usarlo en este caso casi parecería un mal uso. (2) Realmente intento generar un proceso de SO externo. Traer todo Ant solo para eso es, en mi humilde opinión, excesivo. 'maven-exec-plugin' suena como una opción más ligera y más apropiada en este caso. –

+0

Acepto que es exagerado, pero a veces puede ofrecer una manera fácil de hacer cosas que no son Maven. –

+0

Lo divertido es que los usuarios de Google usan Maven para crear la pieza de protobuf de Java, así que no hay absolutamente nada "no-Maven" sobre querer usar un plugin de Maven para compilar mis fuentes .proto. Estoy seguro de que este proceso será más fácil una vez que hayan actuado juntos. Lo único que queda realmente es obtener este complemento en el repositorio o central de Google. –

23

El accepted answer me animó a conseguir el plugin proporcionado por Google para trabajar. Fusioné la rama mencionado en mi pregunta en un pago y envío del código fuente 2.2.0, construido e instalado/desplegado el plugin, y fue capaz de utilizarlo en mi proyecto de la siguiente manera:

<build> 
    <plugins> 
     <plugin> 
     <groupId>com.google.protobuf.tools</groupId> 
     <artifactId>maven-protoc-plugin</artifactId> 
     <version>0.0.1</version> 
     <executions> 
      <execution> 
      <id>generate-sources</id> 
      <goals> 
       <goal>compile</goal> 
      </goals> 
      <phase>generate-sources</phase> 
      <configuration> 
       <protoSourceRoot>${basedir}/src/main/protobuf/</protoSourceRoot> 
       <includes> 
       <param>**/*.proto</param> 
       </includes> 
      </configuration> 
      </execution> 
     </executions> 
     <configuration> 
      <protocExecutable>/usr/local/bin/protoc</protocExecutable> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

Tenga en cuenta que he cambiado el la versión del complemento a 0.0.1 (no -SNAPSHOT) para hacer que vaya a mi repositorio Nexus de terceros no snapshot. YMMV. El punto clave es que este complemento se podrá utilizar una vez que ya no sea necesario pasar por los aros para que funcione.

+0

Gracias por los comentarios. –

+9

Por favor, haga que este complemento esté disponible en Maven Central. Además, ¿hay alguna manera de invocar el protocolo mediante programación en lugar de buscar un ejecutable? Es complicado generar protocolos en muchas plataformas, incluido Mac OS X. – inder

4

Acabo de actualizar el plugin maven para trabajar con 2.2.0 - los pom actualizados se adjuntan al error de revisión de código.

Aquí están las instrucciones para construir el plugin usted mismo:

svn co http://protobuf.googlecode.com/svn/branches/maven-plugin/tools/maven-plugin 
cd maven-plugin 
wget -O pom.xml 'http://protobuf.googlecode.com/issues/attachment?aid=8860476605163151855&name=pom.xml' 
mvn install 

continuación, puede utilizar la configuración experta anteriormente.

21

La solución aceptada no se escala para múltiples archivos proto. Tuve que crear el mío:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>compile-protoc</id> 
        <phase>generate-sources</phase> 
        <configuration> 
         <tasks> 
          <mkdir dir="${generated.sourceDirectory}" /> 
          <path id="proto.path"> 
           <fileset dir="src/main/proto"> 
            <include name="**/*.proto" /> 
           </fileset> 
          </path> 
          <pathconvert pathsep=" " property="proto.files" refid="proto.path" /> 
          <exec executable="protoc" failonerror="true"> 
           <arg value="--java_out=${generated.sourceDirectory}" /> 
           <arg value="-I${project.basedir}/src/main/proto" /> 
           <arg line="${proto.files}" /> 
          </exec> 
         </tasks> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
</build> 
+0

cómo especificar la ubicación del archivo protoc.exe. mi compilación falla porque no puede ubicar el protocolo. ¿El protocolo proporcionado por la dependencia PB 2.4.1 se agrega al pon.xml? –

+0

No, el protocolo es el compilador de búfer de protocolo y debe instalarse en la máquina en la que se está ejecutando la construcción e incluida en la ruta de esa máquina. Consulte https://code.google.com/apis/protocolbuffers/docs/proto.html#generating (específicamente la sección sobre generación de clases) para obtener más información – chrisbunney

4

Acabo de probar un sistema menos oficial pero muy reciente (v 0.1.7) tenedor de https://github.com/dtrott/maven-protoc-plugin y funcionó muy bien, cortesía de David Trott. Lo probé con un par de módulos de Maven, uno de los cuales contenía mensajes estilo DTO y el otro un servicio que dependía de ellos. Me prestado la configuración del plugin MAXA publicada el 16 oct '09, yo tenía protoc en mi camino y me añadido

<temporaryProtoFileDirectory>${basedir}/target/temp</temporaryProtoFileDirectory>

justo después

<protocExecutable>protoc</protocExecutable>.

Lo que es realmente agradable es que todo lo que tuve que hacer es declarar una dependencia normal del módulo de servicio en el módulo DTO. El complemento fue capaz de resolver las dependencias de los archivos proto archivando los archivos proto empaquetados con el módulo DTO, extrayéndolos a un directorio temporal y usándolos al generar código para el servicio. Y fue lo suficientemente inteligente como para no empaquetar una segunda copia de las clases de DTO generadas con el módulo de servicio.

0

Inventé el plugin de David Trott y lo he compilado en varios idiomas, lo que lo hace mucho más útil. Vea el proyecto github here y un tutorial sobre cómo integrarlo con maven build here.

10

También hay un gran complemento de Igor Petruk llamado protobuf-maven-plugin. Ahora está en repo central y juega muy bien con eclipse (se recomienda m2e-1.1).

+1

La documentación para el complemento de Igor es [aquí] (http: // igor-petruk.github.com/protobuf-maven-plugin/usage.html). Si coloca sus archivos '.proto' en' src/main/protobuf', obtendrá la salida en 'target/generated-sources/protobuf'. Todavía necesitarás 'protoc' en tu' PATH' para que esto funcione. – Brad

4

Hay un complemento maven para protobuf. https://www.xolstice.org/protobuf-maven-plugin/usage.html

La configuración mínima

<plugin> 
    <groupId>org.xolstice.maven.plugins</groupId> 
    <artifactId>protobuf-maven-plugin</artifactId> 
    <version>0.5.0</version> 
    <configuration> 
     <protocExecutable>/usr/local/bin/protoc</protocExecutable> 
    </configuration> 
    <executions> 
     <execution> 
     <goals> 
      <goal>compile</goal> 
      <goal>test-compile</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
Cuestiones relacionadas