Protoc Java 插件的依赖关系? [英] Dependencies for Protoc Java plugin?

查看:88
本文介绍了Protoc Java 插件的依赖关系?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 如何做一个工作示例用 Java 编写一个自定义的 Protobuf CodeGenerator .当我尝试使用

I'm trying to make working example at How to write a custom Protobuf CodeGenerator in Java . When I try to compile a file with

import com.google.protobuf.compiler.PluginProtos;

import java.io.IOException;

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

我收到编译错误,因为 CodeGenerator 未知.我在 pom.xml Maven 文件中的dependencies"标签中有以下内容 -

I get compile error because CodeGenerator is unknown. I have in my pom.xml Maven file the following inside "dependencies" tag -

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.6.1</version>
</dependency>

我还需要向依赖项添加什么才能使我的插件工作?我计划使用来自 https://developers.google.com/的 Java APIprotocol-buffers/docs/reference/java/ .

What else do I need to add to dependencies make my plugin working? I plan to use Java API from https://developers.google.com/protocol-buffers/docs/reference/java/ .

推荐答案

是的,这有点愚蠢 - CodeGenerator 是一个自定义类,我们需要编写它,它的名称暗示它来自 Google 库,因此令人困惑.

Yeah, that was a bit stupid - CodeGenerator is a custom class, we need to write it, it's the name which confuses by implying it's from the Google library.

所以写完之后可能看起来像这样 - https://www.expobrain.net/2015/09/13/create-a-plugin-for-google-protocol-buffer/ ,但没有打包成JSON 和清理子字段:

So after writing it could look like this - approximate analogy of Python code at https://www.expobrain.net/2015/09/13/create-a-plugin-for-google-protocol-buffer/ , but without packaging into JSON and cleaning subfields:

import com.google.protobuf.DescriptorProtos;
import com.google.protobuf.compiler.PluginProtos;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ProtocPlugin {
    private static List _traverse(String strPackage, List items) {
        List<List> res = new ArrayList<>();
        for(Object item : items) {
            res.add(Arrays.asList(item, strPackage));
            if(item instanceof DescriptorProtos.DescriptorProto) {
                DescriptorProtos.DescriptorProto dp = (DescriptorProtos.DescriptorProto) item;
                for(DescriptorProtos.EnumDescriptorProto e : dp.getEnumTypeList()) {
                    res.add(Arrays.asList(e, strPackage));
                }
                for(DescriptorProtos.DescriptorProto nested : dp.getNestedTypeList()) {
                    String strNestedPackage = strPackage + nested.getName();
                    for(Object nestedItem : _traverse(strNestedPackage, nested.getNestedTypeList())) {
                        res.add(Arrays.asList(((List)nestedItem).get(0), strNestedPackage));
                    }
                }
            }
        }
        return res;
    }

    public static void main(String[] args) throws IOException {
        StringBuilder data = new StringBuilder();
        PluginProtos.CodeGeneratorRequest codeGeneratorRequest = PluginProtos.CodeGeneratorRequest.parseFrom(System.in);
        codeGeneratorRequest.getProtoFileList().forEach((DescriptorProtos.FileDescriptorProto fileDescriptorProto) -> {
            String strPackage = fileDescriptorProto.getPackage();
            if(strPackage == null || strPackage.isEmpty()) {
                strPackage = "&lt;root&gt;";
            }
            data.append("package: ").append(strPackage).append("\n");
            data.append("filename: ").append(fileDescriptorProto.getName()).append("\n");

            List<DescriptorProtos.EnumDescriptorProto> enums = fileDescriptorProto.getEnumTypeList();
            for(Object pair : _traverse(strPackage, enums)) {
                data.append("type: enum").append("\n");
                data.append(((List)pair).get(0)).append(((List)pair).get(1)).append(" ");
            }

            List<DescriptorProtos.DescriptorProto> messageTypes = fileDescriptorProto.getMessageTypeList();
            for(Object pair : _traverse(strPackage, messageTypes)) {
                data.append("type: message").append("\n");
                data.append(((List)pair).get(0)).append(((List)pair).get(1)).append(" ");
            }
        });

        PluginProtos.CodeGeneratorResponse.Builder builder = PluginProtos.CodeGeneratorResponse.newBuilder();
        builder.addFileBuilder().setContent(data.toString()).setName("mytest.txt");
        PluginProtos.CodeGeneratorResponse response = builder.build();
        response.writeTo(System.out);
    }
}

protoc 的推出可能与

The launch of protoc could be with

protoc --plugin=protoc-gen-custom=my-plugin.bat --custom_out=. hello.proto

其中 my-plugin.bat 包含类似内容

where my-plugin.bat contains something like

@echo off
java -cp target/classes;c:/users/bover/.m2/repository/com/google/protobuf/protobuf-java/3.6.1/protobuf-java-3.6.1.jar ProtocPlugin

这里我们假设我们的 Java 插件将 ProtocPlugin.class 编译到 target/classes 目录中.输出将在 mytest.txt 文件中.hello.proto 是来自上面 Python 示例的简单 proto 文件.

here we assume that our Java plugin compiles ProtocPlugin.class into target/classes directory. The output will be in mytest.txt file. hello.proto is a simple proto file from the Python example above.

这篇关于Protoc Java 插件的依赖关系?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆