基于 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. 域名查询是否注册的demo

    import json import multiprocessing import threading import requests import xmltodict # 万网查询 def chec ...

  2. 实现Servlet接口

    1 右键项目->Build Path->Configure Build Path 2 Add Library...->Server Runtime 3 Apache Tomcat-& ...

  3. etcd单节点安装

    本篇安装单个etcd,然后进行扩容etcd节点至2个,环境配置如果做了的话就跳过 实验架构 test1: 192.168.0.91 etcd test2: 192.168.0.92 无 test3: ...

  4. python关键字参数和位置参数

    关键字参数必须跟随在位置参数后面! 因为python函数在解析参数时, 是按照顺序来的, 位置参数是必须先满足, 才能考虑其他可变参数.,否则报错如下: In [74]: print(s1.forma ...

  5. Day06:抽象类、接口和内部类(上)

    JVAV中的常量 什么是常量? 常量就是不会变化的数值 为什么需要常量? 方便使用(调用)不会变化的数值 特性 不能修改 所有对象共享 常量一定是成员 定义 public static final 类 ...

  6. LeetCode.925-长按的名字(Long Pressed Name)

    这是悦乐书的第355次更新,第380篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第217题(顺位题号是925).你的朋友正在键盘上输入他的名字. 有时,在键入字符c时, ...

  7. 【神经网络与深度学习】leveldb的实现原理

    郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技系列博客整理的,原文地址:http://www.samecity.com/blog/Index.asp?SortID=12,只是为 ...

  8. Maven使用基础

    (转)https://my.oschina.net/xiaomaoandhong/blog/104045 基于 约定优于配置(Convention Over Configuration)的原则,无特殊 ...

  9. python 并发编程 基于线程池实现并发的套接字通信

    不应该让服务端随着 并发的客户端数量增多,而无数起线程,应该用线程池,限制线程数量,控制最大并发数 io密集型程序,最大并发数是2 客户端 from socket import * client = ...

  10. mac os cmake安装

    1.下载安装程序,地址为 http://www.cmake.org/download/,下载 Unix/Linux Source (has \n line feeds) cmake-3.0.2.tar ...