我在一个现有的,相当香草Maven 2项目与Protocol Buffers的实验。 目前,我每次我需要更新我的生成源时调用脚本。 这显然是一件麻烦事,因为我想在每个构建前自动产生的来源。 但愿而不诉诸可耻两轮牛车。
所以,我的问题是双重的:
长镜头:有没有“协议缓冲区插件”对Maven 2能够实现上述在AUTOMAGIC方式? 有一个在谷歌代码分支它的作者出现在实施这样的插件已经采取了一枪。 不幸的是,它没有通过代码审查或者被合并到主干的protobuf。 该插件的状态是这样未知。
也许更现实:缺乏实际的插件,怎么回事我可能会去调用protoc
从我的Maven构建2? 我想我或许可以连线了我现有的shell脚本到antrun
调用或类似的东西。
个人的经验是最赞赏。
你会发现有关在该协议缓冲存储库中的插件的一些信息Protocol Buffers的编译器的Maven插件上Protocol Buffers的讨论组线程。 我的理解是,这是可用的,但缺乏测试。 我给它一试。
或者你可以只使用antrun
插件(snipet从上述线程粘贴):
<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>
该接受的答案鼓励我得到了谷歌提供的插件工作。 我在合并我的问题提到到的2.2.0源代码检出,建造和安装/部署插件的分支,并能够按如下方式使用它在我的项目:
<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>
请注意,我为了让它进入我的非快照第三方的Nexus库改变了插件的版本0.0.1(无-SNAPSHOT)。 因人而异。 外卖的是,这个插件将是可用的,一旦它不再是必要的,以便让它去赴汤蹈火。
接受的解决方案不能扩展多个原文件。 我只好拿出我自己的:
<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>
还有由Igor Petruk伟大的插件命名的protobuf-Maven的插件 。 这是在中央回购现在与Eclipse恰好扮演(M2E-1.1推荐)。
我刚刚更新了Maven插件与2.2.0工作 - 更新POM附着在代码审查的bug。
下面是打造自己的插件的说明:
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
然后,您可以使用上面的行家配置。
我只是想从一个不太正式,但非常近(V 0.1.7)叉https://github.com/dtrott/maven-protoc-plugin和它的工作非常出色,大卫·特洛特的礼貌。 我有一对夫妇的Maven的模块,其中一个包含DTO式的消息,并根据他们的其他服务进行了测试。 我借插件配置MAXA张贴在10月16日09,我有protoc对我的道路,我加入
<temporaryProtoFileDirectory>${basedir}/target/temp</temporaryProtoFileDirectory>
右后
<protocExecutable>protoc</protocExecutable>
。
什么是非常好的是,我必须做的是要申报从DTO模块上的服务模块正常的依赖。 该插件能够通过寻找与DTO模块封装的原文件,将其解压到一个临时目录,并使用而产生的服务代码,以解决原文件的依赖性。 它是不够打包生成的DTO类的第二个副本与服务模块的智能。
有一个Maven插件的protobuf的。 https://www.xolstice.org/protobuf-maven-plugin/usage.html
最小配置
<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>
我觉得用antrun
调用非Maven的步骤是普遍接受的解决方案。
你也可以尝试Maven的EXEC-插件 。
我分叉大卫·特罗特的插件,并把它编译多种语言这使得它更为有用。 见GitHub的项目在这里 ,并与一个Maven构建整合它的教程在这里 。