当前位置: 首页 > article >正文

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

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 mainimport ("flag""fmt""google.golang.org/protobuf/compiler/protogen"
    )func main() {var flags flag.FlagSetprotogen.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。

相关文章:

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

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

服务发现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…...

HTTP代理的实际用处有哪些?HTTP代理强在哪里?

嘿&#xff0c;小伙伴们&#xff01;今天咱们来聊聊 HTTP 代理。大家可能会经常在网页上看到类似“HTTP 代理”的关键词&#xff0c;是不是会心生疑惑&#xff1a;这不就是个技术名词吗&#xff1f;它到底有啥用呢&#xff1f;别急&#xff0c;听我娓娓道来。 一、什么是HTTP代…...

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

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

【Vue Vapor Mode :技术突破与性能优化的可能性】

Vue Vapor Mode &#xff1a;技术突破与性能优化的可能性 前言 作为一名有着Vue 2经验和Vue 3经验的开发者&#xff0c;你一定深刻体会过Vue从Options API到Composition API的演进&#xff0c;也感受过Vue 3在性能上相比Vue 2的显著提升。现在&#xff0c;Vue团队正在开发一个…...

Parasoft C++Test软件单元测试_常见问题及处理

系列文章目录 Parasoft C++Test软件静态分析:操作指南(编码规范、质量度量)、常见问题及处理 Parasoft C++Test软件单元测试:操作指南、实例讲解、常见问题及处理 Parasoft C++Test软件集成测试:操作指南、实例讲解、常见问题及处理 进阶扩展:自动生成静态分析文档、自动…...

vue渲染数组各子项实现文本超出宽度显示tooltip

vue渲染数组各子项实现文本超出宽度显示tooltip 需求背景 vue项目中&#xff0c;通过v-for渲染数组&#xff0c;子项中均存在一行描述文字。当描述文字超出固定宽度时&#xff0c;显示省略号并且鼠标悬浮时显示tooltip&#xff1b;当描述文字不超出固定宽度时则正常显示&…...

libreoffice容器word转pdf

先说结论&#xff0c;市面上不花钱的&#xff0c;简单的效果好的就是这个种方式&#xff0c;在线测试下来不如命令转的效果好。AsposeWords和SpireDoc效果都不错&#xff0c;但是只有这个word转pdf感觉花3-5w不划算。 下载容器路径 https://docker.aityp.com/i/search?searchl…...

AI模型升级与机器人产业落地同步推进

2025年5月28日&#xff0c;中国AI领域迎来两项实质性进展。DeepSeek-R1模型完成小版本试升级&#xff0c;开源社区发布其0528版本。本次更新聚焦语义理解精准性、复杂逻辑推理和长文本处理能力的提升。在代码测试平台Live CodeBench中&#xff0c;开发者反馈其编程性能已接近Op…...

安全编码与AI接口权限控制

安全编码与AI接口权限控制 在AI系统中,模型服务的开放接口往往涉及敏感数据、核心算法与算力资源,如果缺乏有效的安全编码与权限控制机制,极易引发数据泄露、滥用调用或非法操作等问题。本节将从“接口安全策略”“权限验证流程”“Token管控机制”“多租户身份隔离”四个方…...

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

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

MySQL----视图的创造和使用

这里写目录标题 **创造视图****查看视图****修改视图****更新视图****删除视图** 创造视图 使用create view…创造 语法格式 create[algorithm {undefiend&#xff5c;merge&#xff5c;temptable}]view <视图名> [(<字段名1>[,……,字段名n])]as <select 语…...

c/c++的opencv伽马噪声

理解与实现 C/OpenCV 中的伽马噪声 &#x1f5bc;️ 噪声是大多数图像采集过程中固有的组成部分。理解和模拟不同类型的噪声对于开发鲁棒的图像处理算法至关重要&#xff0c;尤其是在去噪方面。虽然高斯噪声和椒盐噪声是常被讨论的类型&#xff0c;但伽马噪声&#xff08;通常…...

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、背景 在…...

跳表(Skip List)查找算法详解

1、原理 跳表是一种概率型数据结构&#xff0c;通过多层有序链表实现高效查找&#xff0c;时间复杂度接近平衡树&#xff08;O(log n)&#xff09;。其核心思想是通过层级索引加速搜索&#xff0c;结构类似火车时刻表的“快车-慢车”模式。 关键特性&#xff1a; 多层链表&a…...

React从基础入门到高级实战:React 核心技术 - React 与 TypeScript:构建类型安全的应用

React 与 TypeScript&#xff1a;构建类型安全的应用 在现代前端开发中&#xff0c;TypeScript 因其强大的类型系统和编译时错误检查功能&#xff0c;已成为 React 开发者的热门选择。通过为代码添加类型定义&#xff0c;TypeScript 能够显著提升代码的健壮性、可维护性和团队…...

Django orm详解--组成部件

Django ORM 的核心部件可分为模型系统、查询系统、数据库后端和辅助工具四大类&#xff0c;每个部件负责不同的职责&#xff0c;共同实现对象与关系数据库的映射。以下是核心部件的分层解析&#xff1a; 一、模型系统&#xff08;Model System&#xff09; 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…...

Chrome 开发中的任务调度与线程模型实战指南

内容 概述 快速入门指南 核心概念线程词典 线程任务优先使用序列而不是物理线程 发布并行任务 直接发布到线程池通过 TaskRunner 发布 发布顺序任务 发布到新序列发布到当前&#xff08;虚拟&#xff09;主题 使用序列代替锁将多个任务发布到同一线程 发布到浏览器进程中的主线…...

aws instance store 的恢复

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

从零开始创建 Vue 3 开发环境并构建第一个 Demo

Vue 3 是目前前端开发中非常流行的渐进式 JavaScript 框架。本文将手把手带你完成从环境搭建到运行一个基础 Vue 3 示例的全过程。 &#x1f4e6; 一、环境准备 1. 安装 Node.js Vue 项目依赖 Node.js 运行环境&#xff0c;请确保你的电脑已安装 Node.js&#xff08;建议使用…...

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 …...

(自用)Java学习-5.19(地址管理,三级联动,预支付)

1. 地址管理模块 地址展示 前端&#xff1a;通过 showAddress() 发起 Ajax GET 请求&#xff0c;动态渲染地址列表表格&#xff0c;使用 #{tag}、#{name} 等占位符替换真实数据。 后端&#xff1a; 控制器层调用 AddressService&#xff0c;通过 AddressMapper 查询用户地址数…...

【容器】docker使用问题处理

问题一、systemctl start docker启动报 ERROR: ZONE_CONFLICT: docker0 already bound to a zone 处理方法 firewall-cmd --permanent --zonedocker --change-interfacedocker0 systemctl restart firewalld 问题二、启动容器报 ptables failed/iptables: No chain/target/…...

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

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