1.下载protoc.exe和对应jar包
protoc.exe从https://github.com/protocolbuffers/protobuf/releases下载protoc-3.7.0-win64.zip,解压后bin目录下有对应proto.exe文件。
jar包去maven库中搜索protobuf-java-3.7.0.jar.
2.编写test.proto文件
package message;
option java_package = "com.test.message";
option java_multiple_files = true;//生成的message文件是多个,在一个包下,否则是一个包装类
option optimize_for = LITE_RUNTIME;
//Protocol Buffer定义三种优化级别SPEED/CODE_SIZE/LITE_RUNTIME。缺省情况下是SPEED。
//SPEED: 表示生成的代码运行效率高,但是由此生成的代码编译后会占用更多的空间。
//CODE_SIZE: 和SPEED恰恰相反,代码运行效率较低,但是由此生成的代码编译后会占用更少的空间,通常用于资源有限的平台,如Mobile。
//LITE_RUNTIME: 生成的代码执行效率高,同时生成代码编译后的所占用的空间也是非常少。这是以牺牲Protocol Buffer提供的反射功能为代价的。
// SPEED和LITE_RUNTIME相比,在于调试级别上,例如 msg.SerializeToString(&str) 在SPEED模式下会利用反射机制打印出详细字段和字段值,但是LITE_RUNTIME则仅仅打印字段值组成的字符串;
message RequestDataMsg1
{
required int32 id = 1;
optional string dataType = 2;
}
message StringIntegerMap
{
required string dataName = 1;
required int32 data = 2;
}
message ResponseDataMsg2
{
repeated StringIntegerMap dataMap = 1;
}
3.编写generateProto.bat,使用批处理执行protoc.exe --java_out=生成message的目录 test.proto 命令生成message文件(可以在命令行直接去protoc.exe所在目录执行)
@title generate message
@cd %~dp0
@rem %~dp0 “d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径,目录
@rem current dir: %~dp0
%~d0
@echo batch generate proto
@rem @author chencan
@rem @echo off常用于开头,表示不显示所有的命令行信息,包括此句,相当于在每一行开头加 @
@rem 在批处理文件里面用 for,变量就用 %%
@rem set是对参数的定义,动态的话需要加上/p的条件
@echo off
set /p protoFile=please input filename:
if exist "%protoFile%" goto:process
rem call跳转到子批处理,并且不终止父批处理,start 是在新窗口执行
echo file not exist!
rem 再次执行当前批处理
call %0
:process
@echo file:"%protoFile%" exist!
@echo generating message,please wait...
@protoc.exe --java_out=../src %protoFile%
@echo generate success!
pause
goto:eof
proto文件,protoc.exe,generateProto.bat放在同一文件夹下,执行generateProto.bat脚本。
done