我正在尝试使用protobuf nano从proto文件下面生成java文件。我得到了关于如何进行this SO thread的基本指导。
我有这个原型文件personal.proto
:
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
我尝试按照说明from here,更具体地说是 NANO版:
protobuf-2.5.0.zip
和编译器protoc-2.5.0-win32.zip
。protobuf-2.5.0.zip
解压缩到一个文件夹,并在src
子文件夹中解压缩protoc.exe
。java
文件夹,并已发布:mvn clean package -P nano
。该命令运行正常并且在target
文件夹中我有protobuf-java-2.5.0.jar
从这里开始我不知道如何继续,因为initial documentation我有这样的陈述:
- Link with the generated jar file
<protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.
我不确定这意味着什么,如何链接?是否有protoc.exe
的参数指定要使用的jar文件?
我尝试发出此命令:protoc --javanano_out=enum_style=java --java_out=generated personal.proto
但我收到此错误:--javanano_out: protoc-gen-javanano: The system cannot find the file specified
。
问题是:上面我错过了什么/做错了什么?我正在尝试从proto文件上面生成java文件。
答案 0 :(得分:7)
我认为此protoc
未使用javanano
支持进行编译。
预编译的Windows 2.5.0版不包含nano支持,看看源代码,在“src\google\protobuf\compiler
”路径中,包括java生成器,但不包括javanano生成器。谷歌存储库中的最新source code包括javanano。
您可以下载latest source code并尝试使用MinGW和msys或CygWin对其进行编译,请查看此帖How to build google protocol buffers in Windows for mingw?
(稍后我会发布建设过程的详细信息)
<强>更新强>
构建protoc.exe
对于一个原型文件
protoc --javanano_out=store_unknown_fields=true:target/generated-sources personal.proto, target/generated-sources
适用于多个原型文件
protoc --javanano_out=store_unknown_fields=true:target/generated-sources --proto_path=inputpath input/*.proto
编辑 Nano生成器用public static final int
字段替换枚举成员。如果类具有可选的枚举成员,则会出现问题,因为该成员将被编译为原始int
值,并且将采用默认值零,这将是枚举中的第一个元素。为了区分未设置枚举值的情况,可以利用optional_field_style
参数生成java.lang.Integer
而不是原始int。解析proto时,调用者可以在使用该值之前检查该值是否为null。 Null表示未设置值。
上述调用脚本可以变为:
protoc --javanano_out=store_unknown_fields=true,optional_field_style=reftypes:target/generated-sources --proto_path=input input/*.proto