基于 maven 实现跨平台编译 protobuf 文件
基于 maven 实现跨平台编译 protobuf 文件
需求
在团队协作中使用 protobuf 时, 有以下几点需求:
- protoc 跨平台,团队成员不需要在自己的平台上修改 pom.xml
- 方便持续集成,不需要再在集成服务器再单独安装 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>
然后通过插件进行编译即可,如下:
需要特别注意两点
- protocArtifact 的配置不能按照官方文档的示例(下图),配置到 execution 元素下,这样在编译的时候会报错。
- maven 中需要添加对 protobuf-java jar 的依赖,因为 .proto 文件编译后的 java 文件会依赖此包
参考文章
- protobuf-maven-plugin : https://www.xolstice.org/protobuf-maven-plugin/