Idea中使用Maven插件配置Protobuf方法总结
1.引言
在学习netty过程中,使用protobuf包序列化,需要将.proto文件进行编译。
目前通用的做法:
-
手动编译(较为麻烦)
-
下载protoc-x.x.x-xx 工具手动编译
下载页面:
用于编译proto文件(protoc -I=源地址 --java_out=目标地址 源地址/xxx.proto 例子: protoc.exe --java_out=./src/main/java ./MsgInfo.proto
-
通过idea插件进行编译(较为简单)
2.方法
2.1下载Protoc相关软件
下载地址如上部分所示,选择适合自己电脑操作系统的版本。本电脑操作系统为win11 64位,应而选择安装包为protoc-3.19.1-win64.zip。
下载后解压目录如下:
2.2Idea引入依赖
protobuf中央仓库地址:
maven protobuf 包依赖如下:
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.70.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.19.1</version>
</dependency>
</dependencies>
protobuf-maven-plugin中央仓库地址:
protobuf-maven插件依赖:
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocExecutable>
D:\software\protoc-3.19.1-win64\bin\protoc.exe <!-- 刚刚安装的位置 -->
</protocExecutable>
<pluginId>protoc-java</pluginId>
<!-- proto文件放置的目录 -->
<protoSourceRoot>${project.basedir}/src/main/java/com/kevin/proto</protoSourceRoot>
<!-- 生成文件的目录 -->
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<!-- 生成文件前是否把目标目录清空,这个最好设置为false,以免误删项目文件 -->
<clearOutputDirectory>false</clearOutputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
配置选项说明:
protoSourceRoot:proto消息结构体所在文件的路径。
outputDirectory:生成的POJO类和Builder类的目标路径。protocExecutable:protobuf的Java代码生成工具的protoc3.6.1.exe可执行文件的路径。配置好之后,执行插件的compile命令,Java代码就生成了;在Maven的项目编译时,POJO类和Builder类也会自动生成。
2.3建立Msginfo.proto
syntax = "proto3";
package com.kevin.domain;
option java_package = "com.kevin.domain";
option java_multiple_files = true;
option java_outer_classname = "MsgInfo";
message MsgBody {
string channelId = 1;
string msgInfo = 2;
}
-
.proto文件的头部声明中,需要声明一下所使用的Protobuf协议版本,示例中使用的是"proto3"版本。也可以使用旧一点的"proto2"版本,两个版本的消息格式有一些细微的不同,默认的协议版本为"proto2"。
-
**option java_package **选项的作用为:在生成proto文件中消息的POJO类和Builder(构造者)的Java代码时,将生成的Java代码放入该选项所指定的package类路径中
-
option java_outer_classname选项的作用为:在生成proto文件所对应的Java代码时,生成的Java外部类使用配置的名称。
-
在proto文件中,使用message关键字来定义消息的结构体。在生成proto对应的Java代码时,每个具体的消息结构体将对应于一个最终的Java POJO类。结构体的字段(Field)对应到POJO类的属性(Attribute)。也就是说,每定义一个message结构体相当于声明一个Java中的类。proto文件的message可以内嵌message,就像Java的内部类一样
-
每个消息结构体可以有多个字段。定义一个字段的格式为“类型名称 = 编号”。例如,“string channelId = 1;”表示该字段是String类型,字段名为channelId,编号为2。字段编号表示在Protobuf数据包的序列化、反序列化时该字段的具体排序。
2.4执行插件compile命令
1.使用idea 中maven插件指令,点击Plugins中的compile指令
2.执行过程
3.结果在domain中生成pojo类和builder类
生成目录结构:
D:.
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─kevin
│ │ │ ├─client
│ │ │ ├─domain
│ │ │ ├─proto
│ │ │ ├─server
│ │ │ └─util
│ │ └─resources
│ └─test
│ └─java
└─target
└─protoc-dependencies
└─6d2f12ab31e91e52b8d93b03a6ed30c4
└─google
└─protobuf
└─compiler
引用
《Java高并发核心编程(卷I):NIO、Netty、Redis、Zookeeper》尼恩著
~~
引用
《Java高并发核心编程(卷I):NIO、Netty、Redis、Zookeeper》尼恩著