2017-01-02 3 views
2

사내 독점 프로그래밍 언어 용 사용자 정의 코드 생성기를 작성하려고합니다. protoc 플러그인 가이드를 사용하여 Java로 생성기를 작성할 수 있다고 생각했습니다. 어떻게 호출 할 :;Java에서 사용자 정의 Protobuf CodeGenerator를 작성하는 방법

문제가 (실제로 생성 로직을 작성하기 전에 먼저 작업 뭔가 그루터기를 얻고 싶었다 분명히 나는 ​​이제 막 시작했습니다가)

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 "[email protected]" 

을 그리고이 같은 protoc를 호출 시도 : 그것은 생각으로

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at CodeGeneratorMain.main(CodeGeneratorMain.java:12) --code_out: protoc-gen-code: Plugin failed with status code 1.

: 그러나 protoc --plugin=protoc-gen-code --code_out=./build hello.proto 나는 것을 실행하면,이 오류가 발생합니다 CodeGeneratorRequest를 stdin에 전혀 전달하지 않습니다. 어떻게 확인할 수 있습니까? 나는 분명히 잘못된 것을하고 있습니까?

+0

잠재적으로 약간의 OT : Java 코드 생성을 찾고 있다면 https://github.com/square/javapoet을 볼 가치가 있습니다. –

+0

자바 클래스를 생성하지 않을 것입니다. ProtoBufs는 이미 Java 소스를 생성 할 수 있습니다. 이것은 비 Java 코드를 생성하는 Java 플러그인입니다. – FreeMemory

답변

0

읽고 내가 아주 바보 같은 오류를 실현 문서를 다시 읽어 그래서 후 : protoc는 표준 입력 변수는 argv를 통해하지를 통해 구문 분석 입력을 전달합니다. 즉, 이것을 다음과 같이 변경하면 PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(args[0].getBytes());PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(System.in);

으로 변경합니다.

관련 문제