天道酬勤,学无止境

Protoc Java 插件的依赖关系?(Dependencies for Protoc Java plugin?)

问题

我正在尝试在 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 文件中的“dependencies”标签中有以下内容 -

<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。

回答1

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

所以在写完之后它可能看起来像这样 - https://www.expobrain.net/2015/09/13/create-a-plugin-for-google-protocol-buffer/ 上的 Python 代码的近似类比,但没有打包成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);
    }
}

protoc 的推出可能与

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

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 将协议缓冲区集成到 Maven2 构建中(Integrate Protocol Buffers into Maven2 build)
    问题 我正在一个现有的、相当普通的 Maven 2 项目中试验协议缓冲区。 目前,我每次需要更新生成的源时都会调用一个 shell 脚本。 这显然很麻烦,因为我希望在每次构建之前自动生成源代码。 希望不要诉诸可耻的hackery。 所以,我的问题有两个方面: 远景:是否有 Maven 2 的“协议缓冲区插件”可以以自动方式实现上述目标? 谷歌代码上有一个分支,其作者似乎已经尝试实现这样的插件。 不幸的是,它没有通过代码审查或被合并到 protobuf 主干中。 因此,该插件的状态未知。 可能更现实:缺少实际的插件,我还能如何从我的 Maven 2 构建中调用protoc ? 我想我可以将我现有的 shell 脚本连接到antrun调用或类似的东西中。 个人经验最受赞赏。 回答1 您将在 Protocol Buffers 讨论组的 Protocol Buffers Compiler Maven Plug-In 线程中的 Protocol Buffers 存储库中找到有关该插件的一些信息。 我的理解是它可用但缺乏测试。 我想试一试。 或者你可以只使用antrun插件(从上面提到的线程粘贴的antrun ): <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions>
  • Gradle 无法检测 osdetector 插件(Gradle not able to detect osdetector plugin)
    问题 我在使用 gradle 的 Java GRPC 项目中使用 OpenSSL。 我阅读了文档,其中提到我们应该按照此链接中的说明进行安全设置。 我在 build.gradle 文件中包含了 osdetector 插件。 但是当我构建项目时,gradle 无法解析 osdetector 插件并抛出错误 > Failed to apply plugin [id 'com.google.protobuf'] > Plugin with id 'osdetector' not found. 我的gradle文件如下: def neo4jVersion = "2.3.3" apply plugin: 'application' apply plugin: 'java' apply plugin: 'com.google.protobuf' apply plugin: 'idea' apply plugin: 'com.google.osdetector' buildscript { repositories { mavenCentral() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.3' classpath 'com.google.gradle:osdetector-gradle
  • Android中的ProtoBuf应用-基础篇
    项目中经常用到Gson,xml等数据格式,今天接触到一个新的(对我来说是新的)格式,决定尝试一下其在Android中的用法,折腾了半天,终于搞完了,在此总结一下基本用法。 ProtoBuf的优势: 跨平台,跨语言。你可以在Android,Linux,Windows多个平台使用它并且不受Java,Python还是C++的限制数据量小。由于其独特的序列化方式,使得其比其他数据格式更小,传输效率更高。扩展性好,兼容性好。在更新数据结构后,基于其特有的Builder方式,可以不对原有的代码产生影响。 搭建环境 在Android Studio中搭建环境并没有想象中的轻松,历经了多种方式,辗转多个教程才最终运行成功,主要有以下几个步骤: 1.在项目的build.gradle中添加依赖 dependencies { classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.10' } 2.在app的build.gradle中添加插件 apply plugin: 'com.google.protobuf' 3.在app的build.gradle的android目录下添加sourceSets sourceSets { main { java {
  • 在 IntelliJ 中使用 Gradle 导入 Protobuf 生成的类(Import Protobuf generated classes using Gradle in IntelliJ)
    问题 我在使用 Gradle 导入 Protobuf 生成的类时遇到问题。 这是我的项目树的样子: 我尝试将包标记为源,我尝试了所有可能的导入组合: import generated.main.grpc.GreeterGrpc; import main.java.HelloRequest; import java.*; import HelloRequest; 它们都不起作用。 这是我的 build.gradle: group 'andu' version '1.0-SNAPSHOT' apply plugin: 'java' apply plugin: 'com.google.protobuf' sourceCompatibility = 1.5 repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } buildscript { repositories { mavenCentral() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' } } dependencies { testCompile group: 'junit', name: 'junit', version
  • gradle 依赖版本冲突(gradle dependency version conflict)
    问题 我有以下依赖脚本: apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.asdf.asdf" minSdkVersion 10 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } buildTypes.each { it.buildConfigField 'String', 'YOUTUBE_API_KEY', YoutubeApiKey } } protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.0.0-beta-2' } plugins { grpc { artifact = 'io.grpc:protoc
  • 在 Eclipse IDE 中使用 maven/m2e 从 .proto 自动生成 Java(Automatically generate Java from .proto with maven/m2e in Eclipse IDE)
    问题 对于我的团队,我想将 maven/eclipse build 配置为从*.proto文件(在使用 gRPC 的项目中)自动生成 Java 代码。 目前需要运行mvn generate-source或mvn protobuf:compile (如插件使用页面)。 或者相同的 add Run 配置来调用 maven 目标compile 。 每当刷新 Eclipse Maven 项目( Alt + F5 )或重新启动 IDE 时,都会重建项目,但不会出现在target/generated ,从而将项目变成红色。 所以需要生成和刷新项目( F5 )。 更新 Eclipse 需要在.clathpath文件中配置源文件夹。 据我所知,这应该是 m2e 连接器,但我只能找到一个 https://github.com/masterzen/m2e-protoc-connector 用于最古老的 Google s plugin com.google.protobuf.tools:maven-protoc-plugin ,目前在 https://github.com/grpc/grpc-java 中甚至没有提到 我们使用完全引用/推荐的 <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin<
  • Maven & Protobuf 编译错误:在包 com.google.protobuf 中找不到符号(Maven & Protobuf compile error: Cannot find symbol in package com.google.protobuf)
    问题 我是 Linux 和 Protobuf 的新手。我需要帮助。 我正在尝试“mvn package”一个包含许多“.proto”文件的项目,当然还有一个 pom.xml 文件...... 我在 Ubuntu 上工作 ======================================== 错误 当我运行“mvn package”时,我收到此错误: 后 ... Compiling 11 source files to .../target/classes ... 我收到一堆这些错误: [ERROR] .../target/generated-sources/...java:[16457,30] cannot find symbol [ERROR] symbol : class Parser [ERROR] location: package com.google.protobuf [ERROR] [ERROR] .../target/generated-sources/...java:[17154,37] cannot find symbol [ERROR] symbol : class Parser [ERROR] location: package com.google.protobuf [ERROR] [ERROR] .../target/generated
  • 协议不生成服务存根文件(protoc not generating service stub files)
    问题 我刚刚开始玩Google Proto。 当我尝试编译proto-java示例中存在的proto文件时,它不会生成任何grpc文件。 原始文件,https://github.com/grpc/grpc-java/blob/master/examples/src/main/proto/hello_world.proto 终端输出 rsonkhla @ raman-OptiPlex-9020:〜/ sandbox / grpc-java / examples $ protoc --version libprotoc 3.0.0 rsonkhla @ raman-OptiPlex-9020:〜/ sandbox / grpc-java / examples $ protoc --java_out = test / -I ../../ grpc-java / examples ../../grpc-java/examples/src/main/proto/hello_world.proto rsonkhla @ raman-OptiPlex-9020:〜/ sandbox / grpc-java / examples $ ls -R test / test /:io 测试/ io:grpc test / io / grpc:示例测试/ io / grpc /示例:helloworld
  • 如何获得Eclipse来解析Maven 2生成的类?(How do I get Eclipse to resolve classes generated with Maven 2?)
    问题 我正在使用Google协议缓冲区为我的项目生成一些Java类。 使用Maven 2及其“ antrun”插件,这些类在编译之前重新生成,输出到目标/生成源,并在构建期间放在类路径中。 因此,从POM构建项目是没有问题的。 但是,Eclipse不知道如何解析生成的类,因为在开发过程中它所在的文件夹似乎不在IDE的类路径上。 我正在使用m2eclipse并让它为我管理依赖项,因此我期望Maven会照顾到这一点。 如何获得生成代码的IDE支持(代码完成等)? 回答1 m2eclipse支持这一点。 首先,将该路径添加到您的构建路径中: <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/java/<
  • 管理共享协议缓冲区库并使用 Gradle 进行编译(Managing Shared Protocol Buffer library and using Gradle to Compile)
    问题 我想要使​​用协议缓冲区 (gRPC) 进行通信的 3 个 Java 应用程序(后端、前端和 Android 应用程序)。 所以我希望这 3 个应用程序都能够访问我管理 .proto 文件的共享 protobuf 存储库(Github)。 我是使用 Gradle 和 protobufs 的新手,所以我不确定管理它的正确方法是什么,任何帮助或指导将不胜感激。 我可以让每个 Gradle 项目将我的 github protobuf repo 声明为依赖项,然后在构建项目时将其拉下来并编译吗? 我认为这种方式将是一个很好的方法,而不是存储已编译的 protobuf 类,因为 Android 应用程序可能需要不同的“Java-lite”版本的 protobufs? 我正在使用 google/protobuf-gradle-plugin 编译 .proto 文件,并查看从本地文件编译的文档,或拉入具有预编译 .proto 文件的项目,但没有拉入远程 .proto 文件的文档。 我在正确的轨道上吗? 回答1 你的远程 .proto 文件/repo 是什么形式? 如果它只是一个网址,那么您可以使用下载任务: buildscript { repositories { mavenCentral() } dependencies { classpath 'com.google.protobuf
  • SpringBoot + GoogleProtobuf
    SpringBoot + GoogleProtobuf 项目地址: protobuf-simple :https://github.com/Cyanss/protobuf-simple 一、环境配置   protobuf-java版本的选择需要对应到C++等其他端的版本以及Maven中protobuf-java版本。这里选择3.4.0版本进行演示及测试。 电脑系统: Windows 10 x64 bit protobuf GitHub: https://github.com/protocolbuffers/protobuf protobuf 源码下载: protobuf-java-3.4.0.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.4.0/protobuf-java-3.4.0.zip protoc 编译器下载: protoc-3.4.0-win32.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.4.0/protoc-3.4.0-win32.zip 注:protoc编译器3.4.0版本只有32位安装包。 protobuf-java 依赖: <dependency> <groupId>com
  • 使用 gradle 进行简单的 protobuf 编译(simple protobuf compilation with gradle)
    问题 如果您正在寻找示例 gradle protobuf 项目,请看这里。 我在使用 gradle 和 protobuf 时遇到困难,我想创建一个简单的 gradle 项目,该项目将从默认的src/main/proto 、 src/test/proto获取任何 proto 文件并将它们编译为src/main/java 、 src/test/java相应地,然后将其打包到一个 jar 中并发布到本地存储库。 不幸的是,我是 gradle 的新手,无法弄清楚原始项目是如何组成的。 这是我未完成的 build.gradle 文件 apply plugin: 'java' apply plugin: "com.google.protobuf" buildscript { repositories { mavenCentral() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.0' } } repositories { mavenCentral() } dependencies { compile 'com.google.protobuf:protobuf-java:3.0.0-beta-1' } sourceSets { main { proto { srcDir 'src/main
  • [golang] go micro 微服务部署
    1、安装Service Discovery 默认情况请安装consul(下载地址:https://www.consul.io/downloads.html),下载对应的系统下的文件,将可执行文件放入GOPATH下面的bin目录下2、安装Protobuf 安装protoc (下载地址:https://github.com/protocolbuffers/protobuf/releases),下载对应的系统下的文件,将可执行文件放入GOPATH下面的bin目录下安装好上面的的两个micro依赖后,将依赖执行文件放入环境变量中(可以将其放入go的环境变量中,go环境本身需已经加入了环境变量)3、下载go-micro支持插件 由于golang.org/x/net被墙了,所以需要设置代理访问 go get -u github.com/golang/protobuf/{proto,protoc-gen-go} go get -u github.com/micro/protoc-gen-micro https_proxy=192.168.3.5:1080 go get -u github.com/micro/micro #代理地址修改为:https://goproxy.io4、编辑器所在环境的gopath目录下的./pkg/mod/下面需要包含引用的包,不然编辑器编辑的时候将无法引用到包
  • Dependencies for Protoc Java plugin?
    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
  • maven-antrun-plugin:为 protobuf 生成源不生成 Java 文件(maven-antrun-plugin: generate sources for protobuf does not generate Java files)
    问题 我的pom.xml有以下插件,它应该生成编译其他项目所需的java文件: <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <archive> <manifestFile>META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase>
  • IDEA中protobuf 各版本编译java文件和js文件
    1、protobuf文件: syntax = "proto2"; message MsgProto { required int32 version = 1; optional LineProto line = 2; } message LineProto { required int32 number = 1; repeated Line list = 3; } message Line { required int32 interNr = 1; optional int32 dirStatus = 2; } proto文件放在maven框架main文件夹下的与java文件夹平级下: 在这里插入图片描述 2、pom.xml文件: <properties> <!--grpc版本号--> <grpc.version>1.7.0</grpc.version> <!--protobuf 版本号--> <protobuf.version>3.4.0</protobuf.version> </properties> protobuf的依赖库: <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>${protobuf
  • How to implement com.google.protobuf.BlockingRpcChannel for gRPC generated Java code?
    I recently took a proto file representing a gRPC service and generated Java code from it. However, all the interfaces expect a com.google.protobuf.BlockingRpcChannel and I don't have any idea on how to create it. When I look at example, I see people using io.grpc.ManagedChannel but that is because the generated Java code used that type instead. I'm not sure if it's because i'm using a specific version of protobuf or what? public static BlockingInterface newBlockingStub(com.google.protobuf.BlockingRpcChannel channel) { return new BlockingStub(channel); } Here are examples of what i've seen
  • Gradle not able to detect osdetector plugin
    I am using OpenSSL for my Java GRPC project which uses gradle. I read the documetation which mentions that we should make security settings as mentioned in this link. I have included the osdetector plugin in the build.gradle file. But when I build the project, gradle is not able to resolve the osdetector plugin and throwing error > Failed to apply plugin [id 'com.google.protobuf'] > Plugin with id 'osdetector' not found. My gradle file is as follows: def neo4jVersion = "2.3.3" apply plugin: 'application' apply plugin: 'java' apply plugin: 'com.google.protobuf' apply plugin: 'idea' apply plugin
  • idea下使用gradle多项目构建生成proto协议并使用
    idea下使用gradle多项目构建生成proto协议并使用 注意事项1.本文要达到的效果2. 建立目录结构根目录下setting.gradle配置根目录下build.gradleprotocol子项目的build.gradle中的配置: 3.写proto协议4.产生java代码5. 解决之前的警告6.使用proto协议写代码7.后记 注意事项 项目的路径不能有中文!不能有中文!不能有中文! 1.本文要达到的效果 我们的目的是在protocol子项目中写xx.proto的协议文件,然后产生java代码在shared项目中,其他项目依赖shared项目,从而让其他项目可以使用到proto协议。 2. 建立目录结构 根目录下setting.gradle配置 rootProject.name = 'multiProject' include 'project1' include 'project2' include 'protocol' include 'shared' 根目录下build.gradle 由于我需要java和kotlin混编,所以这里也有支持kotlin编译的配置,如果只是java项目,可以去掉对应导入。 buildscript { ext { kotlin_version = '1.3.72' } repositories { mavenCentral() }
  • simple protobuf compilation with gradle
    If you're looking for sample gradle protobuf project look here. I'm having hard time with gradle and protobuf, i want to create a simple gradle project that will take any proto files from default src/main/proto, src/test/proto and compile them to src/main/java, src/test/java accordingly, then pack that into a jar and publish to local repo. Unfortunately i'm new to gradle and cant figure out how the original project is composed. Here is my unfinished build.gradle file apply plugin: 'java' apply plugin: "com.google.protobuf" buildscript { repositories { mavenCentral() } dependencies { classpath