基于 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/
基于 maven 实现跨平台编译 protobuf 文件的更多相关文章
- 基于maven的spring-boot的pom文件详解
Spring Boot 推荐的基础 POM 文件 名称 说明 spring-boot-starter 核心 POM,包含自动配置支持.日志库和对 YAML 配置文件的支持. spring-boot-s ...
- 编译protobuf的jar文件
1.准备工作 需要到github上下载相应的文件,地址https://github.com/google/protobuf/releases protobuf有很多不同语言的版本,因为我们需要的是ja ...
- 一些基本的操作,编译,构建,单元测试,安装,网站生成和基于Maven部署项目。
一些基本的操作,编译,构建,单元测试,安装,网站生成和基于Maven部署项目. 使用Maven构建项目“mvn package” 来构建项目 使用Maven清理项目“mvn clean” 来清理项目 ...
- Protobuf - 使用scons编译proto文件
使用protobuf过程中,需要先对消息结构进行定义,文件以.proto格式结尾.然后要使用google提供的protoc命令行,把.proto文件转成对应的代码文件. protoc --proto_ ...
- Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包
一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mv ...
- 一种Maven项目启动时不编译java文件的解决方案
问题 前提介绍 : 环境版本 : JDK -version : 1.8.0-251 Tomcat -version : 8.5.5 Maven -version : 3.6.3 项目情况描述 使用ID ...
- 学习笔记——Maven实战(四)基于Maven的持续集成实践
Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...
- 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建
基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建 前言 最近做回后台开发,重新抓起以前学过的SSM(Spring+Sp ...
- 基于maven进行spring 和mybatis的整合(Myeclpise)
学习日记:基于maven进行spring和mybatis的整合,进行分页查询 什么是maven:maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试 ...
随机推荐
- linux 下的快捷键操作
概述 今天发现自己码代码的效率有点低,所以查找了一下 linux 常用的快捷键操作,记录下来,供以后开发时参考,相信对其他人也有用. linux 终端常用快捷键 tab:补全命令 Ctrl + u:剪 ...
- Android 动态申请权限
AndroidManifest.xml(清单文件)添加需要的权限 <uses-permission android:name="android.permission.ACCESS_CO ...
- python中sys.argv使用
创建一个脚本,内容如下 [root@bogon ~]# cat a.py #conding:utf-8import sysprint(sys.argv[0]) # 打印sys.argv的第0个参数 执 ...
- JDBC操作数据库的基本操作
JDBC操作数据库的基本步骤: 1)加载(注册)数据库驱动(到JVM). 2)建立(获取)数据库连接. 3)创建(获取)数据库操作对象. 4)定义操作的SQL语句. 5)执行数据库操作. 6)获取并操 ...
- 【推荐算法工程师技术栈系列】程序语言--Java
目录 JDK 初步 ArrayList LinkedList Vector Stack HashMap Hashtable LinkedHashMap TreeMap HashSet LinkedHa ...
- 【Sass】常用知识点总结
如何编译Sass Partials Variables colors font stacks 全局变量 Mixins 全局mixin 推荐的mixin插件 Bourbon Extend/Inherit ...
- Synchronized底层优化(轻量级锁、偏向锁)(二)
一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质 ...
- js if(!!!e) {} 判断条件中的三个感叹号什么意思
两个感叹号的意思就是,将变量转换为其对应的布尔值. !!e就是e对应的布尔值,true或者false. !!!e==!(!!e)==!true/!false=false/true;
- /etc/sysctl.conf 控制内核相关配置文件
/etc/sysctl.conf 用于控制内核相关的配置参数,而且它的内容全部是对应于 /proc/sys/ 这个目录的子目录及文件 [root@MongoDB ~]# ll /proc/sys to ...
- 在CentOS 8 Linux中安装使用Cockpit服务器管理软件
在本文中,我们将帮助您在CentOS 8服务器中安装Cockpit Web 控制台,以管理和监视本地系统以及网络环境中的Linux服务器.您还将学习如何将远程Linux主机添加到Cockpit并在Ce ...