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

mavne protobuf .proto  跨平台 

需求

在团队协作中使用 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 中央仓库的存储格式

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


编译

需要特别注意两点

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

官方配置示例

参考文章

  1. protobuf-maven-plugin : https://www.xolstice.org/protobuf-maven-plugin/

基于 maven 实现跨平台编译 protobuf 文件的更多相关文章

  1. 基于maven的spring-boot的pom文件详解

    Spring Boot 推荐的基础 POM 文件 名称 说明 spring-boot-starter 核心 POM,包含自动配置支持.日志库和对 YAML 配置文件的支持. spring-boot-s ...

  2. 编译protobuf的jar文件

    1.准备工作 需要到github上下载相应的文件,地址https://github.com/google/protobuf/releases protobuf有很多不同语言的版本,因为我们需要的是ja ...

  3. 一些基本的操作,编译,构建,单元测试,安装,网站生成和基于Maven部署项目。

    一些基本的操作,编译,构建,单元测试,安装,网站生成和基于Maven部署项目. 使用Maven构建项目“mvn package” 来构建项目 使用Maven清理项目“mvn clean” 来清理项目 ...

  4. Protobuf - 使用scons编译proto文件

    使用protobuf过程中,需要先对消息结构进行定义,文件以.proto格式结尾.然后要使用google提供的protoc命令行,把.proto文件转成对应的代码文件. protoc --proto_ ...

  5. Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包

    一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mv ...

  6. 一种Maven项目启动时不编译java文件的解决方案

    问题 前提介绍 : 环境版本 : JDK -version : 1.8.0-251 Tomcat -version : 8.5.5 Maven -version : 3.6.3 项目情况描述 使用ID ...

  7. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

  8. 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建

    基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建 前言 最近做回后台开发,重新抓起以前学过的SSM(Spring+Sp ...

  9. 基于maven进行spring 和mybatis的整合(Myeclpise)

    学习日记:基于maven进行spring和mybatis的整合,进行分页查询 什么是maven:maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试 ...

随机推荐

  1. springboot之RocketMq实现

    环境:win10 1.下载安装包 http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-re ...

  2. Solr安装并导入mysql数据

    参考博客:https://blog.csdn.net/u013160017/article/details/81037279 下载地址:https://lucene.apache.org/solr/m ...

  3. 转·带你用实例理解C语言回调函数

    原文出处:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 前言: 如不懂函数指针,请先查阅关于函数指针内容的资料(h ...

  4. 【VS开发】【图像处理】Pleora推出iPORT CL-U3外置抓帧器

    全球领先的高性能视频接口产品供应商Pleora科技公司近日宣布推出可将Camera Link®摄像头转化为USB3Vision™摄像头的首个产品iPORT CL-U3外置抓帧器,树立了另一个行业里程碑 ...

  5. Maven从入门到精通(三)

    我们已经了解了Maven的环境搭建以及POM的主要标签及作用,接下来我们要讲解一下Maven的仓库以及jar下载的一个过程 首先我们要明白仓库及以下一些概念 1.仓库:    在Maven中,任何一个 ...

  6. Elasticsearch-使用映射来定义各种文档

    ES-使用映射来定义各种文档 每篇文档属于一种类型,而每种类型属于一个索引.从数据的逻辑划分来看,可以认为索引是数据库,而类型是数据库中的表.类型包含了映射中每个字段的定义.映射包括了该类型的文档中可 ...

  7. keil格式化项目代码

    有时候需要用到一个功能,就先会在网上找到对应的程序,但是百度直接拿来的程序通常不是很规范.想着keil5要是有一个自动格式化代码的功能就好啦,上网一查还真有!需要一些设置如下(keil4与keil5都 ...

  8. 原生CURD

    <?phpheader("content-type:text/html;charset=utf8");$link=mysqli_connect("127.0.0.1 ...

  9. YII框架微信公众号

    <?phpnamespace backend\controllers; use yii\db\Query;use yii\web\Controller;use Yii;class Exam2Co ...

  10. 出大问题!webpack 多入口&&html模板在后端

    新公司前后端不分离,后端用的是php的twig 我用webpack做多入口文件的打包,虽然成功了.但是引入js和css是在twig上写死的根据文件名. 一开始没问题,因为就定死了那么几个global. ...