基于 maven 实现跨平台编译 protobuf 文件

基于 maven 实现跨平台编译 protobuf 文件

需求

在团队协作中使用 protobuf 时, 有以下几点需求:

  1. protoc 跨平台,团队成员不需要在自己的平台上修改 pom.xml
  2. 方便持续集成,不需要再在集成服务器再单独安装 protoc ,增加运维工作量和项目的特殊性

分析

google 官方提供了不同平台的 protoc 程序,并可以通过 maven 中央仓库获取,所以如果 maven plugin 能够检测当前系统平台,并主动去 中央仓库 下载对应平台的 protoc 程序,然后再编译 .proto 文件,那么就可以实现

实现

  • 可以通过 os-maven-plugin 插件来侦测当前系统平台
  • 可以通过 protobuf-maven-plugin 插件来下载 protoc 程序,并编译 .proto 文件。

程序目录如下:

代码结构
代码结构

pom.xml 具体配置如下:

<build>

    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.5.0.Final</version>
      </extension>
    </extensions>
    <plugins>
      <plugin>
        <groupId>org.xolstice.maven.plugins</groupId>
        <artifactId>protobuf-maven-plugin</artifactId>
        <version>0.5.1</version>
        <extensions>true</extensions>
        <configuration>
          <!-- .proto 文件的目录-->
          <protoSourceRoot>src/main/proto</protoSourceRoot>
          <!-- 编译后的文件存放目录 -->
          <outputDirectory>${project.build.sourceDirectory}</outputDirectory>
         <!--是否每次执行都清除输出目录-->
          <clearOutputDirectory>false</clearOutputDirectory>
          <!-- 这句很重要,这句插件会去仓库下载 protoc 程序,exe 与 windows 的可执行程序 exe 可不一样,在这,不管是什么平台,都是 exe ,可见下图 -->
          <protocArtifact>com.google.protobuf:protoc:3.6.1:exe:${os.detected.classifier}</protocArtifact>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>test-compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>

protoc 程序在 maven 中央仓库的存储格式
protoc 程序在 maven 中央仓库的存储格式

然后通过插件进行编译即可,如下:

编译
编译

需要特别注意两点

  • protocArtifact 的配置不能按照官方文档的示例(下图),配置到 execution 元素下,这样在编译的时候会报错。
  • maven 中需要添加对 protobuf-java jar 的依赖,因为 .proto 文件编译后的 java 文件会依赖此包

官方配置示例
官方配置示例

参考文章

  1. protobuf-maven-plugin : https://www.xolstice.org/protobuf-maven-plugin/
posted @ 2018-09-16 23:19  feshfans  阅读(1323)  评论(0编辑  收藏  举报