如何用Java编写自定义Protobuf CodeGenerator

时间:2017-01-02 20:24:20

标签: java protocol-buffers protoc

我正在尝试为内部专有编程语言编写自定义代码生成器。我想我可以用Java编写生成器,使用protoc插件指南。我的main()做了这样的事情:

public static void main(String[] args) throws IOException {
    CodeGenerator gen = new CodeGenerator();
    PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(args[0].getBytes());
    codeGeneratorRequest.getProtoFileList().forEach(gen::handleFile);
    // get the response and do something with it 
    //PluginProtos.CodeGeneratorResponse response = PluginProtos.CodeGeneratorResponse.newBuilder().build();
    //response.writeTo(System.out);
}

(显然我刚开始;想在实际编写生成逻辑之前先得到一些粗短的工作)

问题是:如何使用--plugin参数调用protoc以使用我的插件以我的自定义语言生成代码?我尝试编写一个shell脚本来执行此操作:

#!/bin/bash
java -cp ./codegen.jar CodeGeneratorMain "$@"

我尝试像这样调用protoc:protoc --plugin=protoc-gen-code --code_out=./build hello.proto然而,当我运行它时,我收到此错误:

  

线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:0     在CodeGeneratorMain.main(CodeGeneratorMain.java:12)   --code_out:protoc-gen-code:插件失败,状态码为1。

好像它根本没有在stdin上传递CodeGeneratorRequest。我该如何验证?我做了一件明显不对的事吗?

1 个答案:

答案 0 :(得分:0)

因此,在阅读并重新阅读文档后,我意识到了我非常愚蠢的错误:protoc通过argv通过 stdin 而不是传递解析的输入。这意味着,如果我将此更改为PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(args[0].getBytes());PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(System.in);

它有效。