protobuf下载地址
目前最新版本protobuf-java-3.21.5.tar.gz
tar -xzvf protobuf-java-3.21.5.tar.gz cd protobuf-3.21.5 ./configure make make check sudo make install
which protoc protoc --version
<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>
//定义的是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字段。