maven中的grpc编译插件protobuf-maven-plugin详解

news2025/7/20 18:25:01

protobuf-maven-plugin 是 Maven 中用于编译 Protocol Buffers(protobuf)文件并生成对应语言代码(如 Java、C++、Python 等)的插件。在 gRPC 项目中,它常被用来生成服务端和客户端所需的代码。以下是该插件的详细解析:

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

在这里插入图片描述


1. 插件作用

  • 编译 .proto 文件:将 .proto 文件编译为指定语言的代码(如 Java 的 POJO 类、gRPC 的服务接口等)。
  • 支持 gRPC 代码生成:通过配置插件,可以生成 gRPC 服务端和客户端的代码。
  • 自动化集成:与 Maven 的构建流程集成,无需手动调用 protoc 编译器。

2. 插件配置示例

在 Maven 的 pom.xml 文件中,配置 protobuf-maven-plugin 的示例如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.6.1</version> <!-- 使用最新版本 -->
            <configuration>
                <!-- 指定 protoc 编译器的版本和路径 -->
                <protocArtifact>com.google.protobuf:protoc:3.21.12:exe:${os.detected.classifier}</protocArtifact>
                <!-- 指定 gRPC 插件的版本和路径 -->
                <pluginId>grpc-java</pluginId>
                <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.57.2:exe:${os.detected.classifier}</pluginArtifact>
                <!-- 指定 proto 文件目录 -->
                <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
                <!-- 指定生成的代码输出目录 -->
                <outputDirectory>${project.basedir}/target/generated-sources/protobuf</outputDirectory>
                <!-- 是否清空输出目录 -->
                <clearOutputDirectory>false</clearOutputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <!-- 编译 proto 文件生成基础消息类 -->
                        <goal>compile</goal>
                        <!-- 编译 proto 文件生成 gRPC 代码 -->
                        <goal>compile-custom</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

3. 关键配置项解析

  • protocArtifact
    指定 protoc 编译器的版本和路径。${os.detected.classifier} 会根据操作系统自动选择对应的版本(如 osx-x86_64linux-x86_64 等)。

  • pluginIdpluginArtifact
    pluginId 指定插件类型(如 grpc-java),pluginArtifact 指定 gRPC 插件的版本和路径。

  • protoSourceRoot
    指定 .proto 文件的目录,默认为 ${project.basedir}/src/main/proto

  • outputDirectory
    指定生成的代码输出目录,默认为 ${project.build.directory}/generated-sources/protobuf

  • clearOutputDirectory
    是否在生成代码前清空输出目录。设为 false 可以避免重复生成时丢失已有代码。

  • goals

    • compile:生成基础的消息类(如 Java 的 POJO)。
    • compile-custom:生成 gRPC 相关的代码(如服务接口和客户端代码)。

4. 依赖项

为了使生成的 gRPC 代码能够正常工作,需要在 pom.xml 中添加 gRPC 的依赖:

<dependencies>
    <!-- gRPC 核心依赖 -->
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty-shaded</artifactId>
        <version>1.57.2</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-protobuf</artifactId>
        <version>1.57.2</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-stub</artifactId>
        <version>1.57.2</version>
    </dependency>
    <!-- Protocol Buffers 运行时依赖 -->
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.21.12</version>
    </dependency>
</dependencies>

5. 使用流程

  1. 编写 .proto 文件
    src/main/proto 目录下编写 .proto 文件,定义消息和服务。例如:

    syntax = "proto3";
    option java_package = "com.example.grpc";
    option java_outer_classname = "HelloWorldProto";
    
    service Greeter {
      rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    message HelloRequest {
      string name = 1;
    }
    
    message HelloReply {
      string message = 1;
    }
    
  2. 运行 Maven 编译
    执行以下命令生成代码:

    mvn compile
    

    生成的代码会出现在 target/generated-sources/protobuf 目录下。

  3. 在代码中使用生成的类
    生成的代码包括:

    • 消息类(如 HelloRequestHelloReply)。
    • gRPC 服务接口(如 GreeterGrpc)。

6. 常见问题

  • 版本不匹配
    确保 protobuf-maven-pluginprotoc 和 gRPC 插件的版本兼容。建议使用最新稳定版本。

  • 代码未生成
    检查 .proto 文件是否放在正确的目录下,并确认插件配置中的 protoSourceRootoutputDirectory 是否正确。

  • 操作系统兼容性
    ${os.detected.classifier} 会自动处理操作系统的差异,但如果出现问题,可以手动指定 protoc 的路径。

  • ${os.detected.classifier}报红

    Could not find artifact com.google.protobuf:protoc:exe:${os.detected.classifier}:3.3.0 in

    • 解决方案:
      在build标签中增加extensions标签,如下所示:
    <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.4.1.Final</version>
            </extension>
        </extensions>
    

    整体配置如下所示:

    <build>
         <plugins>
             <plugin>
                 <groupId>org.xolstice.maven.plugins</groupId>
                 <artifactId>protobuf-maven-plugin</artifactId>
                 <version>0.6.1</version>
                 <configuration>
                     <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
                     <pluginId>grpc-java</pluginId>
                     <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
                     <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
                     <outputDirectory>${project.basedir}/src/main/java/com/xxx/cloud/demo/grpc/service</outputDirectory>
                     <clearOutputDirectory>false</clearOutputDirectory>
                 </configuration>
                 <executions>
                     <execution>
                         <!--在执行mvn compile的时候会执行以下操作-->
                         <phase>compile</phase>
                         <goals>
                             <!--生成OuterClass类-->
                             <goal>compile</goal>
                             <!--生成Grpc类-->
                             <goal>compile-custom</goal>
                         </goals>
                     </execution>
                 </executions>
             </plugin>
         </plugins>
         <extensions>
             <extension>
                 <groupId>kr.motd.maven</groupId>
                 <artifactId>os-maven-plugin</artifactId>
                 <version>1.4.1.Final</version>
             </extension>
         </extensions>
     </build>
    
    

7、protocPlugin解析

protoc_plugin 是 Protocol Buffers(protobuf)编译器 protoc 的插件,用于根据 .proto 文件生成特定语言的代码。不同语言和场景下有多种常用的 protoc_plugin,以下是一些常见插件的解析:

1. protoc-gen-go(Go语言插件)
  • 用途:用于生成 Go 语言的 protobuf 代码。
  • 特点
    • 由 Google 官方维护,与 Go 生态深度集成。
    • 支持 protobuf 的消息定义和服务定义。
    • 生成的代码可直接用于 gRPC 或序列化场景。
  • 使用示例
    protoc --go_out=. --go_opt=paths=source_relative your_file.proto
    
2. protoc-gen-grpc-java(Java gRPC 插件)
  • 用途:用于生成 Java 语言的 gRPC 客户端和服务端代码。
  • 特点
    • 生成的代码包括 gRPC 的服务接口和消息类。
    • 支持 Java 的多种构建工具(如 Maven、Gradle)。
  • 使用示例(Maven 配置):
    <plugin>
        <groupId>org.xolstice.maven.plugins</groupId>
        <artifactId>protobuf-maven-plugin</artifactId>
        <configuration>
            <pluginId>grpc-java</pluginId>
            <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.57.2</pluginArtifact>
        </configuration>
    </plugin>
    
3. protoc-gen-dart(Dart 语言插件)
  • 用途:用于生成 Dart 语言的 protobuf 代码。
  • 特点
    • 支持 Flutter 和 Dart 开发。
    • 生成的代码可用于 Dart 虚拟机或浏览器(通过 dart2js)。
  • 使用示例
    protoc --dart_out=. your_file.proto
    
4. protoc-gen-grpc-python(Python gRPC 插件)
  • 用途:用于生成 Python 语言的 gRPC 客户端和服务端代码。
  • 特点
    • 生成的代码包括 gRPC 的服务接口和消息类。
    • 支持 Python 的异步编程模型。
  • 使用示例
    pip install grpcio-tools
    python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. your_file.proto
    
5. protoc-gen-ts(TypeScript 插件)
  • 用途:用于生成 TypeScript 语言的 protobuf 代码。
  • 特点
    • 生成的代码可用于浏览器或 Node.js。
    • 支持 gRPC-Web(用于浏览器端 gRPC 通信)。
  • 使用示例
    protoc --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts --ts_out=. your_file.proto
    
6. 自定义 protoc 插件
  • 用途:根据业务需求生成特定格式的代码或文档。
  • 特点
    • 插件是一个独立的二进制程序,通过标准输入/输出与 protoc 通信。
    • 使用 protocCodeGeneratorRequestCodeGeneratorResponse 协议缓冲区消息进行交互。
  • 实现步骤
    1. 从标准输入读取 CodeGeneratorRequest
    2. 解析 .proto 文件信息。
    3. 生成目标代码。
    4. 将生成的代码封装为 CodeGeneratorResponse 并写入标准输出。
  • 示例(Go 实现)
    package main
    
    import (
        "flag"
        "fmt"
        "google.golang.org/protobuf/compiler/protogen"
    )
    
    func main() {
        var flags flag.FlagSet
        protogen.Options{
            ParamFunc: flags.Set,
        }.Run(func(gen *protogen.Plugin) error {
            for _, f := range gen.Files {
                if !f.Generate {
                    continue
                }
                // 生成目标代码
                g := gen.NewGeneratedFile(f.GeneratedFilenamePrefix+".custom.txt", f.GoImportPath)
                g.P("// 自定义生成的代码")
                for _, msg := range f.Messages {
                    g.P(fmt.Sprintf("message %s {", msg.GoIdent.GoName))
                    for _, field := range msg.Fields {
                        g.P(fmt.Sprintf("  %s %s = %d;", field.Desc.Kind(), field.GoName, field.Desc.Number()))
                    }
                    g.P("}")
                }
            }
            return nil
        })
    }
    
7. protoc-gen-doc(文档生成插件)
  • 用途:根据 .proto 文件生成文档(如 Markdown、HTML)。
  • 特点
    • 支持多种输出格式。
    • 可用于生成 API 文档。
  • 使用示例
    protoc --doc_out=. --doc_opt=markdown,your_file.md your_file.proto
    
8.vertx-grpc-protoc-plugin

vertx-grpc-protoc-plugin 是专为 Vert.x 框架设计的 gRPC 插件,用于将 .proto 文件编译生成 Vert.x 生态所需的 gRPC 客户端和服务端代码。以下是对其核心特性和作用的解析:

1. 核心功能
  • 代码生成:基于 .proto 文件,自动生成符合 Vert.x 异步编程模型的 gRPC 客户端和服务端代码。
  • 与 Vert.x 集成:生成的代码可直接与 Vert.x 的事件循环和非阻塞特性配合使用,无需额外适配。
  • 简化开发:避免手动编写 gRPC 通信逻辑,开发者可专注于业务实现。
2. 技术特点
  • 异步支持:生成的代码支持 Vert.x 的异步调用方式,适合高并发场景。
  • 多语言支持:通常与 Vert.x 支持的语言(如 Java、Kotlin、Groovy 等)兼容。
  • 依赖管理:可能包含对 Vert.x 依赖的自动管理,简化项目配置。
3. 使用场景
  • Vert.x 微服务:在基于 Vert.x 的微服务架构中,快速实现 gRPC 通信。
  • 实时通信:适用于需要低延迟、高吞吐量的场景(如实时数据推送)。
  • 跨语言服务:通过 gRPC 的多语言支持,与其他语言的服务交互。
4. 与其他插件对比
  • 通用 gRPC 插件:如 protoc-gen-grpc-java 生成的代码是通用的,可能需要额外适配 Vert.x。
  • vertx-grpc-protoc-plugin:专为 Vert.x 优化,生成的代码更贴合 Vert.x 的编程模型。
5. 优缺点
  • 优点
    • 减少样板代码,提升开发效率。
    • 与 Vert.x 深度集成,适合 Vert.x 生态。
  • 缺点
    • 依赖 Vert.x 框架,灵活性可能受限。
    • 社区规模较小,文档和示例可能不如通用插件丰富。
6. 使用示例

假设有一个 .proto 文件 service.proto

syntax = "proto3";
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest { string name = 1; }
message HelloReply { string message = 1; }

使用 vertx-grpc-protoc-plugin 编译后,会生成 Vert.x 风格的 gRPC 客户端和服务端代码,可直接在 Vert.x 项目中使用。

7. 配置建议
  • 在 Vert.x 项目的构建工具(如 Maven 或 Gradle)中配置插件。
  • 确保插件版本与 Vert.x 和 gRPC 版本兼容。

vertx-grpc-protoc-plugin 是 Vert.x 生态中 gRPC 开发的利器,尤其适合需要与 Vert.x 深度集成的项目。它通过自动化代码生成,简化了 gRPC 的开发流程,但可能牺牲一定的灵活性。对于 Vert.x 用户,这是一个值得尝试的工具。

总结
  • 官方插件:如 protoc-gen-goprotoc-gen-grpc-java 等,适用于主流语言,功能稳定。
  • 自定义插件:适用于特定需求,灵活性高,但需要额外开发。
  • 文档生成插件:如 protoc-gen-doc,适用于 API 文档生成。

选择插件时,需根据项目使用的语言、框架和需求进行匹配。对于 gRPC 开发,通常需要结合语言特定的 gRPC 插件(如 protoc-gen-grpc-javaprotoc-gen-grpc-python)和 protobuf 消息插件(如 protoc-gen-goprotoc-gen-dart)。

8. 总结

protobuf-maven-plugin 是 gRPC 项目中不可或缺的工具,通过合理的配置可以自动化生成消息类和 gRPC 代码,大大简化开发流程。关键点包括:

  • 正确配置 protoc 和 gRPC 插件的版本。
  • 指定 .proto 文件和生成代码的目录。
  • 确保依赖项版本兼容。

通过以上配置和使用方法,可以高效地在 Maven 项目中集成 gRPC 和 Protocol Buffers。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务发现Nacos

目录 Nacos server 安装 注册服务到Nacos server 接口访问Nacos server中的已注册服务 Nacos控制台介绍 Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 在分布式服务应用中&#xff0c;各类服务需要统一的注册、统一的管理&#xff0c;这个组件工具…

社群分享:义乌|杭州电商|店群卖家,私域鱼塘运营的排单系统开源|私域鱼塘运营|返款软件开源

熟悉东哥的朋友都知道&#xff0c;我自己也运营一个电商社群&#xff0c;主要是针对玩私域|鱼塘的电商玩家。 在当前电商环境下&#xff0c;社群分享型电商、店群卖家及私域鱼塘运营者&#xff0c;面临着日益复杂的订单管理和客服调度问题。传统的人工处理不仅效率低…

C#回调函数深度解析

文章目录 前言什么是回调函数C#中实现回调的方式委托(Delegate)事件(Event)Action和FuncPredicateAsyncCallback匿名方法和Lambda表达式 回调函数实际应用场景异步编程事件处理策略模式LINQ查询 回调函数的优缺点优点缺点 最佳实践与注意事项总结相关资源 前言 在现代软件开发…

通义智文开源QwenLong-L1: 迈向长上下文大推理模型的强化学习

&#x1f389; 动态 2025年5月26日: &#x1f525; 我们正式发布&#x1f917;QwenLong-L1-32B——首个采用强化学习训练、专攻长文本推理的LRM模型。在七项长文本文档问答基准测试中&#xff0c;QwenLong-L1-32B性能超越OpenAI-o3-mini和Qwen3-235B-A22B等旗舰LRM&#xff0c…

低代码——表单生成器以form-generator为例

主要执行流程说明&#xff1a; 初始化阶段 &#xff1a; 接收表单配置对象formConf深拷贝配置&#xff0c;初始化表单数据和验证规则处理每个表单组件的默认值和特殊配置&#xff08;如文件上传&#xff09; 渲染阶段 &#xff1a; 通过render函数创建el-form根组件递归渲染表…

linux centos 服务器性能排查 vmstat、top等常用指令

背景:项目上经常出现系统运行缓慢,由于数据库服务器是linux服务器,记录下linux服务器性能排查常用指令 vmstat vmstat介绍 vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这…

LiveGBS国标视频平台收流模式:UDP、TCP被动与TCP主动传输模式之差异剖析

LiveGBS国标视频平台收流模式&#xff1a;UDP、TCP被动与TCP主动传输模式之差异剖析 1、背景2、信令传输3、视频流传输3.1、UDP传输模式3.2、TCP被动传输模式3.3、TCP主动传输模式 4、WEB配置流传输模式4.1、编辑模式4.2、下拉切换模式 5、搭建GB28181视频直播平台 1、背景 在…

Tomcat 使用与配置全解

一、 Tomcat简介 Tomcat服务器是Apache的一个开源免费的Web容器。它实现了JavaEE平台下部分技术规范&#xff0c;属于轻量级应用服务器。 1. Tomcat版本 Tomcat版本 JDK版本 Servlet版本 JSP版本 10.0.X 8 and later 5.0 3.0 9.0.x 8 and later 4.0 2.3 8.0.x 7…

aws instance store 的恢复

1: aws instance store 要在launch instance 才可以创建,而且,通过snapshot 恢复后,instance store 里面的数据会丢失。 下面是创建instance store 的过程,和通过两种方式恢复,发现/etc/fstab 不同的写法,有的不能启动: [root@ip-xx ~]# lsblk NAME MAJ:MIN RM …

EasyRTC音视频实时通话助力微信小程序:打造低延迟、高可靠的VoIP端到端呼叫解决方案

一、方案概述​ 在数字化通信浪潮下&#xff0c;端到端实时音视频能力成为刚需。依托庞大用户生态的微信小程序&#xff0c;是实现此类功能的优质载体。基于WebRTC的EasyRTC音视频SDK&#xff0c;为小程序VoIP呼叫提供轻量化解决方案&#xff0c;通过技术优化实现低延迟通信&a…

STM32 SPI通信(软件)

一、SPI简介 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;、MISO&#xff08;Master Input Slav…

每日刷题c++

快速幂 #include <iostream> using namespace std; #define int long long int power(int a, int b, int p) {int ans 1;while (b){if (b % 2){ans * a;ans % p; // 随时取模}a * a;a % p; // 随时取模b / 2;}return ans; } signed main() {int a, b, p;cin >> a …

ChemDraw 2023|Win英文|化学结构编辑器|安装教程

软件下载 【名称】&#xff1a;ChemDraw 2023 【大小】&#xff1a;1.34G 【语言】&#xff1a;英文界面 【安装环境】&#xff1a;Win10/Win11 【夸克网盘下载链接】&#xff08;务必手机注册&#xff09;&#xff1a; https://pan.quark.cn/s/320bcb67da80 【网站下载…

4.1.1 Spark SQL概述

Spark SQL是Apache Spark的一个模块&#xff0c;专门用于处理结构化数据。它引入了DataFrame这一编程抽象&#xff0c;DataFrame是带有Schema信息的分布式数据集合&#xff0c;类似于关系型数据库中的表。用户可以通过SQL、DataFrames API和Datasets API三种方式操作结构化数据…

redis五种数据结构详解(java实现对应的案例)

一、简述 Redis是一款高性能的键值对存储数据库&#xff0c;它支持五种基本数据类型&#xff0c;分别是字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)。 二、五种基本数据类型 2.1 字符串(String) String是Redis最基本的类型&#xff0c;一个key对…

React 生命周期与 Hook:从原理到实战全解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

【机器学习基础】机器学习入门核心算法:逻辑回归(Logistic Regression)

机器学习入门核心算法&#xff1a;逻辑回归&#xff08;Logistic Regression&#xff09; 一、算法逻辑1.1 基本概念1.2 Sigmoid函数1.3 决策边界 二、算法原理与数学推导2.1 概率建模2.2 损失函数推导2.3 梯度下降优化2.4 正则化处理 三、模型评估3.1 常用评估指标3.2 ROC曲线…

智能仓储落地:机器人如何通过自动化减少仓库操作失误?

仓库作业的速度和准确性至关重要&#xff0c;尤其是在当前对无差错、高效作业的要求达到前所未有的环境下。每一个错误&#xff0c;无论是物品放错位置还是库存差异&#xff0c;都会在供应链中产生连锁反应&#xff0c;造成延误、增加成本&#xff0c;并最终影响客户满意度。 …

[低代码表单生成器设计基础]ElementUI中Layout布局属性Form表单属性详解

Layout 布局 ElementUI 的 Layout 布局系统基于 24 栏栅格设计&#xff0c;提供了灵活的响应式布局能力&#xff0c;适用于各种页面结构的构建。(CSDN) &#x1f4d0; 基础布局结构 ElementUI 的布局由 <el-row>&#xff08;行&#xff09;和 <el-col>&#xff0…

从“被动养老”到“主动健康管理”:平台如何重构代际关系?

在老龄化与数字化交织的背景下&#xff0c;代际关系的重构已成为破解养老难题的关键。 传统家庭养老模式中&#xff0c;代际互动多表现为单向的“赡养-被赡养”关系。 而智慧养老平台的介入&#xff0c;通过技术赋能、资源整合与情感连接&#xff0c;正在推动代际关系向“协作…