gpt4 book ai didi

java - Protoc Java 插件的依赖关系?

转载 作者:行者123 更新时间:2023-11-30 05:57:59 24 4
gpt4 key购买 nike

我正在尝试在 How to write a custom Protobuf CodeGenerator in Java 制作工作示例。当我尝试使用

编译文件时
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 文件中有以下“依赖项”标签 -

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

我还需要添加什么到依赖项才能使我的插件正常工作?我计划使用https://developers.google.com/protocol-buffers/docs/reference/java/中的Java API .

最佳答案

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

所以写完后它可能看起来像这样 - Python 代码的近似类比 https://www.expobrain.net/2015/09/13/create-a-plugin-for-google-protocol-buffer/ ,但没有打包成 JSON 并清理子字段:

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);
}
}

协议(protocol)的启动可能是

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

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

@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 文件。

关于java - Protoc Java 插件的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52824549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com