J'expérimente avec des tampons de protocole dans un projet existant, assez Vanilla Maven 2. Actuellement, j'appelle un script Shell chaque fois que j'ai besoin de mettre à jour mes sources générées. C'est évidemment un problème, car j'aimerais que les sources soient générées automatiquement avant chaque build. Si tout va bien sans recourir au piratage honteux.
Donc, ma question est double:
À long terme: existe-t-il un "plug-in de tampons de protocole" pour Maven 2 qui peut réaliser ce qui précède de manière automagique? Il y a branche sur Google Code dont l'auteur semble avoir tenté de mettre en œuvre un tel plugin. Malheureusement, il n'a pas passé en revue le code ou a été fusionné dans le tronc de protobuf. Le statut de ce plugin est donc inconnu.
Probablement plus réaliste: sans un plugin réel, comment pourrais-je faire pour invoquer protoc
depuis ma build Maven 2? Je suppose que je peux être capable de câbler mon script Shell existant dans une invocation antrun
ou quelque chose de similaire.
Les expériences personnelles sont les plus appréciées.
Vous trouverez des informations sur le plugin disponible dans le référentiel Protocol Buffers dans le thread Protocol Buffers Compiler Maven Plug-In du groupe de discussion Protocol Buffers. Ma compréhension est qu'elle est utilisable mais manque de tests. J'essaierais.
Ou vous pouvez simplement utiliser le plugin antrun
(snipet collé à partir du fil mentionné ci-dessus):
<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>
Le réponse acceptée m'a encouragé à faire fonctionner le plugin fourni par Google. J'ai fusionné la branche mentionnée dans ma question dans une caisse de code source 2.2.0, construit et installé/déployé le plugin, et j'ai pu l'utiliser dans mon projet comme suit:
<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>
Notez que j'ai changé la version du plugin en 0.0.1 (pas de -SNAPSHOT) afin de la faire entrer dans mon référentiel Nexus tiers non instantané. YMMV. La conclusion est que ce plugin sera utilisable une fois qu'il ne sera plus nécessaire de sauter à travers des cerceaux pour le faire fonctionner.
La solution acceptée n'est pas mise à l'échelle pour plusieurs fichiers proto. Je devais trouver le mien:
<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>
Il y a aussi un excellent plugin par Igor Petruk nommé protobuf-maven-plugin . Il est maintenant en dépôt central et fonctionne bien avec Eclipse (m2e-1.1 est recommandé).
Je viens d'essayer un fork moins officiel mais très récent (v 0.1.7) de https://github.com/dtrott/maven-protoc-plugin et cela a très bien fonctionné, gracieuseté de David Trott. Je l'ai testé avec quelques modules Maven dont l'un contenait des messages de style DTO et l'autre un service en fonction d'eux. J'ai emprunté la configuration du plugin MaxA publiée le 16 octobre 2009, j'avais un protocole sur mon PATH et j'ai ajouté
<temporaryProtoFileDirectory>${basedir}/target/temp</temporaryProtoFileDirectory>
juste après
<protocExecutable>protoc</protocExecutable>
.
Ce qui est vraiment sympa, c'est que tout ce que j'avais à faire était de déclarer une dépendance normale du module de service sur le module DTO. Le plugin a pu résoudre les dépendances des fichiers proto en trouvant les fichiers proto emballés avec le module DTO, en les extrayant dans un répertoire temporaire et en les utilisant lors de la génération du code pour le service. Et c'était assez intelligent pour ne pas empaqueter une deuxième copie des classes DTO générées avec le module de service.
Il existe un plugin maven pour protobuf. https://www.xolstice.org/protobuf-maven-plugin/usage.html
La configuration minimale
<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>
Je viens de mettre à jour le plugin maven pour qu'il fonctionne avec 2.2.0 - les pom mis à jour sont attachés au bogue de révision de code.
Voici les instructions pour construire le plugin vous-même:
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
Vous pouvez ensuite utiliser la configuration maven ci-dessus.
Je pense que l'utilisation de antrun
pour invoquer des étapes non Maven est la solution généralement acceptée.
Vous pouvez également essayer le maven-exec-plugin .