如何将.proto通过命令转换成.java文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将.proto通过命令转换成.java文件相关的知识,希望对你有一定的参考价值。

1.http://code.google.com/p/protobuf/downloads/list 下载 protoc-2.4.1-win32.zip 至本地并解压

2.通过命令行将.proto的文件生成为.java的文件官网上是这样写的

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

下面用图形来说明如果操作。下载的部分就不说了

命令:


文件夹结构:

参考技术A

Protocol
Buffers的是一个高效且可扩展的格式结构化数据编码的一种方式。

谷歌使用了Protocol
Buffers的几乎所有它的内部RPC协议和文件格式

使用protobuf传输的好处有:二进制传输,安全、数据量小

.proto文件中我们服务器定义需要传输的数据,及数据类型等。而传输的时候则是使用了通过官方工具生成的具体为.java的消息体

http://code.google.com/p/protobuf/

https://developers.google.com/protocol-buffers/docs/overview

可参考官方网上的具体使用

下面介绍如何用将.proto的文件转换成.java的文件

1.http://code.google.com/p/protobuf/downloads/list
下载 protoc-2.4.1-win32.zip 至本地并解压

2.通过命令行将.proto的文件生成为.java的文件官网上是这样写的

protoc -I=$SRC_DIR
--java_out=$DST_DIR $SRC_DIR/addressbook.proto

下面用图形来说明如果操作。下载的部分就不说了

命令:

如何在单个命令中编译多个 proto 文件?

【中文标题】如何在单个命令中编译多个 proto 文件?【英文标题】:How to compile multiple proto files in single command? 【发布时间】:2014-07-25 06:57:29 【问题描述】:

我在单个目录中有两个 proto 文件,我正在寻找一种在单个命令中从这些文件生成类的方法。这似乎可以通过--proto_path 参数来完成。根据文档:

您必须提供一个或多个 .proto 文件作为输入。可以一次指定多个 .proto 文件。尽管文件是相对于当前目录命名的,但每个文件都必须位于 [由 --proto_path 参数指定的] IMPORT_PATH 之一中,以便编译器可以确定其规范名称。

C:\shekhar\proto_trial>dir
 Volume in drive C is C

 Directory of C:\shekhar\proto_trial

07/25/2014  12:16 PM    <DIR>          .
07/25/2014  12:16 PM    <DIR>          ..
07/25/2014  12:16 PM    <DIR>          java_op
07/25/2014  12:16 PM               230 map.proto
07/23/2014  04:24 PM               161 message.proto
07/25/2014  12:17 PM             1,228 response.proto
               3 File(s)          1,619 bytes
               3 Dir(s)  50,259,398,656 bytes free

我使用--proto_path 参数如下所示

C:\shekhar\proto_trial>protoc 
                       --proto_path=C:\shekhar\proto_trial 
                       --java_out=C:\shekhar\proto_trial\java_op 
                       *.proto

但我收到以下错误

message.proto: File does not reside within any path specified using --proto_path (or -I). 
You must specify a --proto_path which encompasses this file. 
Note that the proto_path must be an exact prefix of the .proto file names -- protoc is unable to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).

请提出一些方法来一次性编译所有的 proto 文件。

【问题讨论】:

请参阅developers.google.com/protocol-buffers/docs/proto#generating,了解--proto_path 的用途。指示 protoc 编译哪些文件的标志实际上只是 @filename 参数。 --proto_path 用于解决导入问题。 【参考方案1】:

问题是您将 --proto_path 指定为绝对路径,但您的 proto 文件指定为相对路径。您可以删除 --proto_path 参数(无论如何它默认为当前目录),或者您可以这样做:

protoc --proto_path=C:\shekhar\proto_trial
       --java_out=C:\shekhar\proto_trial\java_op
       C:\shekhar\proto_trial\*.proto

【讨论】:

它不起作用:/main/resources/proto/*.proto: Invalid argument 我找到的唯一解决方案是将每个文件一个接一个地添加到同一行。 @Samoht 扩展 glob (*) 是 shell 的职责。如果您通过不调用 shell 的上下文运行命令,则可能需要手动扩展 glob。 Unix 上扩展glob 是shell 的责任。在 Windows 上,这取决于接收 glob 的程序。另外,fwiw,我正在运行截至 2018 年 6 月 19 日的最新 Windows protoc,而 protoc 似乎不理解(或尝试扩展)glob。 在 Windows 上不适合我。 protoc 无法识别 cdm 处的 *.proto 通配符。 @Saeed 是的,如本线程前面所述,这似乎是 Windows 版本的 protoc 中的错误。【参考方案2】:

这是一个使用 find 的选项

protoc --js_out=js \
        -Iproto/ \
        $(find proto/google -iname "*.proto")

【讨论】:

这应该是正确的答案,因为如果有.proto 文件的子目录,所有相关的.proto 文件都需要使用相同的命令运行才能使目录正确。 【参考方案3】:

Protobuf 命令 >= 3.5

在我看来,Windows 上的普通命令仅适用于 Protobuf here),使用相对目录仍然很容易:

for /f %i in ('dir /b proto_trial\*.proto') do protoc proto_trial\%i --java_out=proto_trial\java_op

或者,从here,如果您安装了 Git Bash,您也可以尝试使用它,因为它可以正确扩展通配符,然后像以前一样使用命令:

protoc proto_trial\*.proto --java_out=proto_trial\java_op

【讨论】:

【参考方案4】:

从此链接https://github.com/google/protobuf/releases/tag/v3.3.0下载windows版本的编译器

从下载的应用程序的 bin 文件夹启动命令提示符。使用 potoc 命令生成类。

    protoc --proto_path=<Directory name where your proto file is residing> 
           --java_out=<Directory name where you want your output classes to get generated> 
           <absolute path of your protofile with extention>

对多个原型文件使用通配符 *

【讨论】:

【参考方案5】:

最简单的方法:

protoc C:\shekhar\proto_trial\*.proto --java_out=C:\shekhar\proto_trial\java_op

【讨论】:

【参考方案6】:

找到 . -name "*.proto" | xargs -I 协议“”

【讨论】:

以上是关于如何将.proto通过命令转换成.java文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 smali 文件i转换成java文件?

如何将已编译的协议缓冲区转换回 .proto 文件?

如何将excel文件转换成.mat文件

Java如何将Word文件转成PDF文件

JAVA如何将二进制数转换成文件?

如何将 OpenAPI Spec (Swagger 2.0) 转换为 proto3?