将协议缓冲区集成到Maven2构建中

Max*_* A. 42 maven-2 protocol-buffers

我正在现有的,相当普通的Maven 2项目中试验Protocol Buffers.目前,每次我需要更新生成的源时,都会调用shell脚本.这显然是一个麻烦,因为我希望在每次构建之前自动生成源.希望不要诉诸可耻的hackery.

所以,我的问题是双重的:

  1. 远射:是否有Maven 2的"Protocol Buffers插件"可以以自动方式实现上述目标?谷歌代码上有一个分支,其作者似乎已经开始实施这样的插件.不幸的是,它没有通过代码审查或合并到protobuf主干.因此,该插件的状态是未知的.

  2. 可能更现实:缺少一个实际的插件,我怎么可能protoc从我的Maven 2版本调用?我想我可以将现有的shell脚本连接到antrun调用或类似的东西.

个人经历非常感谢.

Pas*_*ent 44

您可以在Protocol Buffers讨论组的Protocol Buffers Compiler Maven Plug-In线程中的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>
Run Code Online (Sandbox Code Playgroud)

  • 您还可能希望将failonerror添加到<exec>标记,以便在您的proto文件中出现错误时停止构建.即`<exec failonerror ="true"executable ="protoc">`. (4认同)

Max*_* A. 23

接受的答案鼓励我得到了谷歌提供的插件工作.我将我的问题中提到的分支合并到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>
Run Code Online (Sandbox Code Playgroud)

请注意,我将插件的版本更改为0.0.1(无-SNAPSHOT),以使其进入我的非快照第三方Nexus存储库.因人而异.需要注意的是,一旦不再需要跳过篮筐就可以使用这个插件.

  • 请在Maven Central中提供此插件.此外,有没有办法以编程方式调用protoc而不是寻找可执行文件?在包括Mac OS X在内的许多平台上生成protoc是一件痛苦的事. (9认同)

jsr*_*avn 21

已接受的解决方案无法扩展到多个原型文件.我必须拿出自己的:

<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>
Run Code Online (Sandbox Code Playgroud)


mor*_*wai 10

Igor Petruk也有很棒的插件,名为protobuf-maven-plugin.它现在在中央回购中并与eclipse很好地配合(建议使用m2e-1.1).