mac环境下Maven实现ProtoBuf编译

2023-10-31

mac环境下Maven实现protobuf编译

1、Maven项目创建:File -> new -> Project… -> 输入项目名称 -> finish:

创建项目

2、在项目中创建proto目录:

创建proto目录
该目录用来保存.proto文件,此处将proto目录与src目录放置同一级,后面在配置时会用到

3、配置pom.xml文件:

引入如下项目依赖

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.12.2</version>
</dependency>
        
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.4</version>
    <scope>provided</scope>
</dependency>
4、下面是最重要的一步:编译模块配置

配置pom.xml文件的<build/>模块,引入maven-antrun-plugin插件,该插件用来将.proto文件编译成.java文件

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
        <execution>
            <id>generate-sources1</id>
            <phase>process-test-resources</phase>
            <configuration>
                <tasks>
                    <exec executable="protoc">
                        <arg value="--java_out=src/main/java"/>
                        <arg value="proto/commands.proto"/>
                        <arg value="proto/model.proto"/>
                    </exec>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

在tasks标签中,
<exec executable="protoc"> 用来指定使用“protoc”命令对代码进行编译;
<arg value="--java_out=src/main/java"/>指定要输出的位置,注意:该输出目录只是大致的目录,在proto文件中还有其他相关代码
<arg value="proto/commands.proto"/>用来指定proto文件,我创建了两个文件分别代表不同的功能commands.proto:指定接口,model.proto指定实体类

5、以model.proto代码举例

先粘贴上代码:

option java_package = "com.example.entities";
option java_multiple_files = true;

message AuthenticationSettingsTO {
  optional string avatar = 1;
  optional string username = 2;
  optional string password = 3;
  optional string phone = 5;
}

enum AllianceType {
  Open = 0;
  Closed = 1;
  ByRequest = 2;
}

java_package指定确定的目录,输出结果如下:
项目目录
在pom.xml文件中--java_out参数指定的是第一级目录,通过java_package指定二级目录,java_multiple_files参数指定每一个message都将输出一个文件。
在通过mvn package对代码编译时,就已经将实际代码编译到jar文件中,在其他项目将该proto项目引入即可使用;
编译后的目录及文件

6、import依赖问题

前面5步已经能实现基本.proto文件到.java文件的编译,可是还有一个问题:model.proto文件中是定义基本POJO类,在commands.proto文件中定义命令接口请求命令相关的数据信息;这事commands.proto中定义的数据就可能用到了model.proto中的数据;代码如下:

请求接口数据:commands.proto

// 测试:请求数据
message TestReq {
  User user = 1;
}

// 测试:响应数据
message TestResp {
  User user = 1;
}

POJO类数据:model.proto

message User {
  int64 userId = 1;
  string avatar = 2;
  string nickname = 3;
}

在commands.proto文件中需要将model.proto导入

import "proto/model.proto";

下面代码是官方文档拿下来的:

protoc --proto_path=src/main/proto --java_out=src/main/java src/main/proto/model.proto src/main/proto/commands.proto

在pom.xml中指定--proto_path参数,--java_out参数,和.proto文件的具体路径

<exec executable="protoc">
    <arg value="--java_out=src/main/java"/>
    <arg value="--proto_path=src/main/java/proto"/>
    <arg value="src/main/java/proto/model.proto"/>
    <arg value="src/main/java/proto/commands.proto"/>
</exec>

我将完整的pom.xml文件粘贴下来

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sqkb.game</groupId>
    <artifactId>model-game</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jackson.version>2.5.1</jackson.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.12.2</version>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>process-resources</phase>
                        <configuration>
                            <tasks>
                                <exec executable="protoc">
                                    <arg value="--java_out=src/main/java"/>
                                    <arg value="proto/model.proto"/>
                                    <arg value="proto/commands.proto"/>
                                </exec>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

以及最终完整的目录结构:
在这里插入图片描述

commands.proto文件的全部代码

syntax = "proto3";

package com.proto;

import "proto/model.proto";

option java_package = "com.game.socket.proto.req";
option java_multiple_files = true;

enum RespStatus {
  UNKNOWN_RESP = 0;
  OK = 200;
  NOT_AUTHORIZED = 401;
  RELOAD = 409;
  SERVER_ERROR = 500;
  SERVER_BUSY = 502;
  PLAYING_ON_ANOTHER_DEVICE = 503;
  UNUSED1 = 504;
  UNUSED2 = 505;
  UNUSED3 = 506;
  UNUSED4 = 507;
}

// 请求类型,每增加一个接口都要增加一个类型
enum ReqRepType {
  UnknownReqRepType = 0;
  Test = 1;
  Batch = 2;
  Sync = 3;
}

// 测试:请求数据
message TestReq {
  User user = 1;
}

// 测试:响应数据
message TestResp {
  User user = 1;
}

message WolfServiceReq {
  int32 id = 1;
  ReqRepType type = 2;
  ReqSync reqSync = 100;
}

message WolfServiceResp {
  RespSync respSync = 100;
}

// 同步接口
message ReqSync {
  int32 overrideTutorialGroup = 1;
  string overrideVariant = 2; //used for selecting specialised testing config
  string countryCode = 3;
  string deviceVer = 4;
}

message RespSync {
  string configBaseUrl = 1;
  string gameConfigVersion = 2;
  string langConfigVersion = 3;
  string newsConfigVersion = 4;
}

model.proto的全部代码

syntax = "proto3";

package com.proto;

option java_package = "com.game.socket.proto.entity";
option java_multiple_files = true;

message User {
  int64 userId = 1;
  string avatar = 2;
  string nickname = 3;
}

message Chapter {
  int64 userId = 1;
  int32 level = 2;
  int32 createTime = 3;
}

enum Platform {
  NA = 0;
  IOS = 1;
  ANDROID = 2;
  WEB = 3;
  WINDOWS_PHONE = 4;
  UNUSED5 = 5;
  UNUSED6 = 6;
}

message ClientServerMessageHeader {
  string version = 2;
  string service = 3;
  string tokenId = 4;
  string authentication = 5;
  Platform platform = 8;
  string clide = 10;
}

message StatTO {
  string id = 1;
  int64 sum = 2;
  repeated StatValueTO values = 3;
}

message StatValueTO {
  int64 value = 1;
  int64 time = 2;
}

注意:
在pom文件中如果有<arg value="--proto_path=src/main/java"/> 需要将proto文件写到配置的目录下src/main/java;如果没有proto_path配置,将默认在src同级目录下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mac环境下Maven实现ProtoBuf编译 的相关文章

随机推荐

  • 二阶振荡环节的谐振频率_自动控制系统时域分析十三:对数频率特性

    一 对数频率特性曲线 波德图 Bode图 Bode图由对数幅频特性和对数相频特性两条曲线组成 波德图坐标 横坐标是频率 纵坐标是幅值和相角 的分度 1 横坐标分度 称为频率轴 它是以频率w的对数值logw进行线性分度的 但为了便于观察仍标以
  • 图书管理系统C语言

    C语言简单编写图书管理系统 两种方法 链表 线性表 主要内容 开发一个图书管理系统 基本信息包括图书的书名 作者 ISBN号 基本实现 输出 输入 删除 查询 插入的基本功能 代码如下 运行结果省略 链表 include
  • 《CTFshow-Web入门》03. Web 21~30

    Web 21 30 索引 web21 题解 原理 web22 题解 原理 web23 题解 原理 web24 题解 原理 web25 题解 原理 web26 题解 web27 题解 web28 题解 web29 题解 原理 web30 题解
  • 【C#基础】C# 文件与IO

    序号 系列文章 9 C 基础 C 异常处理操作 10 C 基础 C 正则表达式 11 C 基础 C 预处理器指令 文章目录 前言 1 文件和IO的概念 2 文本文件操作 2 1 File 类 2 2 FileInfo 类 2 3 FileS
  • 不要消费信任

    消费是一种用来满足人们各种需求的过程 人们可以通过消费来满足吃 穿 住 行等物质上的需求 同样的 人们也可以通过消费来满足非物质需求 如 消费人情 权力等 当今世界 消费 是一种需要 而会消费 是一种艺术 但无论怎样 有一种 物品 是绝对经
  • xctf攻防世界 MISC高手进阶区 low

    1 进入环境 下载附件 给出的一张bmp图片 没有其他信息 2 问题分析 扔进binwalk中 没有发现有用信息 使用zsteg 没有有用信息 塞入StegSolve中 发现有点猫腻 如图 有点二维码的感觉 emmm 需要像素处理 但不知道
  • css 获取当前类的子类,删除子类列表项的CSS类属性

    我一直试图在Html中创建一个无序列表 css类将附加 ul 元素及其子元素 li 元素 问题是如果另一个 无序列表 成为这个父无序列表的子元素 删除子类列表项的CSS类属性 我创建了下面的示例 以显示我的问题 的Javascript fu
  • 超详解“二分法查找”,一看就会!

    目录 一 二分法概念用途 二 超详思维图解 三 超详使用方法实现代码运行操作 四 总结 五 结语 一 二分法概念用途 什么是二分法 有什么作用 一般用在何处 概念 二分查找法算法 也叫折半查找算法 对半处理会提高寻找目标数字的效率 作用 在
  • 计算机视觉——图像增强

    图像增强的定义非常广泛 一般来说 图像增强是有目的地强调图像的整体或局部特性 例如改善图像的颜色 亮度和对比度等 将原来不清晰的图像变得清晰或强调某些感兴趣的特征 扩大图像中不同物体特征之间的差别 抑制不感兴趣的特征 提高图像的视觉效果 传
  • “范式杯”2023牛客暑期多校训练营10

    K First Last 一共有n个人 然后每一局拿到第一名或者最后一名的概率为2 n 然后连续m局拿到第一名或者最后一名的概率为pow 2 n m 特判一下当n为1时 拿第一名或者最后一名的概率为1 注意 输出1时要写1 0 写1的话就w
  • Jinja 2模板引擎

    如何使用Flask渲染摸板 在模板中传递一个或多个参数 if 语句在摸板中的使用 for 语句在模板中的使用 Flask 提供了Jiaja 2模板引擎渲染模板 下面逐步介绍其模板渲染机制 templates index html user
  • Phpstorm 插件

    Symfony Plugin 支持 Symfony 2 3 4 Laravel Plugin 支持 Laravel env files support 支持 env 文件BashSupport 支持 BashEditorConfig 支持
  • 【低功耗蓝牙】⑤ 蓝牙HID协议

    摘要 本文章主要介绍了蓝牙HID协议的实现方法 基于ESP32平台实现了蓝牙键盘 蓝牙鼠标 蓝牙自拍杆和蓝牙游戏手柄等设备 是初学者学习BLE HID协议很好的参考文章 HID设备 HID Human Interface Device 人体
  • golang 判断 interface{} 是否为nil

    问题描述 当函数返回值是interface 时 需要判断是不是返回值是不是nil func check interface return nil func main c check if c nil reflect ValuOf c IsN
  • IDEA Android用户登录页面、登录验证、页面跳转演示示例全部源码

    开发工具 IDEA 2022 3 2 未连接数据库 验证用的用户名和密码为内置硬编码 演示程序运行效果 设计器中的用户登录页面布局 登录验证容错提示如下 1 用户名不能为空 2 密码不能为空 3 用户名不存在 4 用户密码错误 5 登录验证
  • lol峡谷之巅区服务器位置,LOL峡谷之巅专区申请地址一览 峡谷之巅介绍

    峡谷之巅 超级专区是英雄联盟官方搭建的 只提供给钻石I 超凡大师 最强王者的玩家及现役战队选手的公平竞技大区 在 峡谷之巅 中 各个服务器的顶级强者及现役战队选手将会共同进行召唤师峡谷的单人排位角逐 该大区的核心宗旨 进一步提升英雄联盟高端
  • 低频能不能采到高频?采样定理指导硬件设计

    原文来自公众号 工程师看海 香浓采样定理或者说奈奎斯特采样定理告诉我们 要以信号频率2倍以上的采样率对该信号进行采样 否则会出现频率混叠 比如对1Khz信号进行采样的话 采样率要高于2Ksps 采样定理与傅里叶变换的具体原理请见往期文章 h
  • Could not create task ‘:app:minifyReleaseWithR8‘. Cannot query the value of this provider because it

    重新部署AndroidStudio发现项目报错 Could not create task app minifyReleaseWithR8 Cannot query the value of this provider because it
  • 性能测试工具LoadRunner —— 性能测试流程及结果分析

    性能测试目的 1 什么是性能测试 性能测试是通过性能的测试工具模拟多种正常 峰值以及异常负载条件来对系统的各项性能指标进行测试 负载测试和压力测试都属于性能测试 两者可以结合进行 通过负载测试 确定在各种工作负载下系统的性能 目标是测试当负
  • mac环境下Maven实现ProtoBuf编译

    mac环境下Maven实现protobuf编译 1 Maven项目创建 File gt new gt Project gt 输入项目名称 gt finish 2 在项目中创建proto目录 该目录用来保存 proto文件 此处将proto目