1、下载安装包
目前最新版本protobuf-java-3.21.5.tar.gz
2、安装
tar -xzvf protobuf-java-3.21.5.tar.gz
cd protobuf-3.21.5
./configure
make
make check
sudo make install
3、验证
which protoc
protoc --version
4、idea使用proto
4.1、配置pom
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<!--proto 文件目录-->
<protoSourceRoot>${project.basedir}/src/main/resources/demo</protoSourceRoot>
<!--编译后文件的输出的目录-->
<outputDirectory>${project.build.sourceDirectory}</outputDirectory>
<!--设置是否在生成java文件之前清空outputDirectory的文件,默认值为true-->
<clearOutputDirectory>false</clearOutputDirectory>
</configuration>
</plugin>
</plugins>
</build>
4.2、proto文件
//定义的是protobuf中使用的Syntax协议,默认情况下是proto2,因为目前最新的协议是proto3
Syntax = "proto3";
//package是指编译的时候生成文件的包。这是一个命名空间,虽然我们在后面定义了java_package,但是为了和非java语言中的协议相冲突
package com.nile;
//java_multiple_files指编译过后java文件的个数,默认是false
//如果是true,那么将会一个java对象一个类,如果是false,那么定义的java对象将会被包含在同一个文件中。
option java_multiple_files = false;
//java_package指定生成的类应该使用的Java包名称。 如果没有明确的指定,则会使用之前定义的package的值。
option java_package = "com.nile.protos";
//java_outer_classname选项定义将表示此文件的包装类的类名。
// 如果没有给java_outer_classname赋值,它将通过将文件名转换为大写驼峰来生成。
// 例如,默认情况下,“msg.proto”将使用”Msg”作为包装类名称。
option java_outer_classname = "MsgProto";
//消息的定义,对于简单类型来说可以使用bool, int32, float, double, 和 string来定义字段的类型。
message Msg {
uint32 id = 1;
optional string content = 2;
}
//字段的修饰符,有三个修饰符分别是optional,repeated和required。
//
//optional表示该字段是可选的,可以设置也可以不设置,如果没有设置,则会使使用默认值,对于简单类型来说,我们可以自定义默认值,如果不自定义,就会使用系统的默认值。对于系统的默认值来说,数字为0,字符串为空字符串,布尔值为false。
//
//repeated表示该字段是可以重复的,这种重复实际上就是一种数组的结构。
//
//required表示该字段是必须的,如果该字段没有值,那么该字段将会被认为是没有初始化,尝试构建未初始化的消息将抛出 RuntimeException,解析未初始化的消息将抛出 IOException。
//在Proto3中不支持required字段。