Как написать собственный Protobuf CodeGenerator на Java

Я пытаюсь написать собственный генератор кода для внутреннего проприетарного языка программирования. Я решил, что могу написать генератор на 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);
}

(Очевидно, я только начал; хотел сначала получить что-то коротенькое, прежде чем писать логику генерации)

Проблема в том, как мне вызвать protoc с аргументом --plugin для генерации кода на моем собственном языке, используя мой плагин? Я попытался написать сценарий оболочки, чтобы сделать это следующим образом:

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

И я попытался вызвать протокол следующим образом: 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.

Как будто он вообще не передает CodeGeneratorRequest на стандартный ввод. Как мне это проверить? Я делаю что-то явно не так?


person FreeMemory    schedule 02.01.2017    source источник
comment
Потенциально немного OT: если вы просто хотите генерировать код Java, возможно, стоит взглянуть на github.com /квадрат/javapoet   -  person Mark Elliot    schedule 02.01.2017
comment
Я не собираюсь генерировать классы Java. ProtoBufs уже может генерировать исходный код Java. Это плагин Java для создания кода, отличного от Java.   -  person FreeMemory    schedule 02.01.2017
comment
как у вас это получилось. Я делаю то же самое. Как вы связываете сценарий оболочки и протокол. Я продолжаю получать сообщение об ошибке, говорящее, что программа не найдена или не является исполняемой. Можете ли вы помочь мне с этим, пожалуйста? stackoverflow.com/questions/62168625/   -  person User    schedule 04.06.2020


Ответы (1)


Итак, прочитав и перечитав документы, я понял свою очень глупую ошибку: protoc передает проанализированный ввод через stdin не через argv. Это означает, что если я изменю это: PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(args[0].getBytes()); на это: PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(System.in);

оно работает.

person FreeMemory    schedule 03.01.2017