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_64
、linux-x86_64
等)。 -
pluginId
和pluginArtifact
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. 使用流程
-
编写
.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; }
-
运行 Maven 编译
执行以下命令生成代码:mvn compile
生成的代码会出现在
target/generated-sources/protobuf
目录下。 -
在代码中使用生成的类
生成的代码包括:- 消息类(如
HelloRequest
和HelloReply
)。 - gRPC 服务接口(如
GreeterGrpc
)。
- 消息类(如
6. 常见问题
-
版本不匹配
确保protobuf-maven-plugin
、protoc
和 gRPC 插件的版本兼容。建议使用最新稳定版本。 -
代码未生成
检查.proto
文件是否放在正确的目录下,并确认插件配置中的protoSourceRoot
和outputDirectory
是否正确。 -
操作系统兼容性
${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
通信。 - 使用
protoc
的CodeGeneratorRequest
和CodeGeneratorResponse
协议缓冲区消息进行交互。
- 插件是一个独立的二进制程序,通过标准输入/输出与
- 实现步骤:
- 从标准输入读取
CodeGeneratorRequest
。 - 解析
.proto
文件信息。 - 生成目标代码。
- 将生成的代码封装为
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-go
、protoc-gen-grpc-java
等,适用于主流语言,功能稳定。 - 自定义插件:适用于特定需求,灵活性高,但需要额外开发。
- 文档生成插件:如
protoc-gen-doc
,适用于 API 文档生成。
选择插件时,需根据项目使用的语言、框架和需求进行匹配。对于 gRPC 开发,通常需要结合语言特定的 gRPC 插件(如 protoc-gen-grpc-java
或 protoc-gen-grpc-python
)和 protobuf 消息插件(如 protoc-gen-go
或 protoc-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(protobuf)文件并生成对应语言代码(如 Java、C、Python 等)的插件。在 gRPC 项目中,它常被用来生成服务端和客户端所需的代码。以下是该插件的详细解析&am…...

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

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

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

通义智文开源QwenLong-L1: 迈向长上下文大推理模型的强化学习
🎉 动态 2025年5月26日: 🔥 我们正式发布🤗QwenLong-L1-32B——首个采用强化学习训练、专攻长文本推理的LRM模型。在七项长文本文档问答基准测试中,QwenLong-L1-32B性能超越OpenAI-o3-mini和Qwen3-235B-A22B等旗舰LRM,…...
HTTP代理的实际用处有哪些?HTTP代理强在哪里?
嘿,小伙伴们!今天咱们来聊聊 HTTP 代理。大家可能会经常在网页上看到类似“HTTP 代理”的关键词,是不是会心生疑惑:这不就是个技术名词吗?它到底有啥用呢?别急,听我娓娓道来。 一、什么是HTTP代…...

低代码——表单生成器以form-generator为例
主要执行流程说明: 初始化阶段 : 接收表单配置对象formConf深拷贝配置,初始化表单数据和验证规则处理每个表单组件的默认值和特殊配置(如文件上传) 渲染阶段 : 通过render函数创建el-form根组件递归渲染表…...
【Vue Vapor Mode :技术突破与性能优化的可能性】
Vue Vapor Mode :技术突破与性能优化的可能性 前言 作为一名有着Vue 2经验和Vue 3经验的开发者,你一定深刻体会过Vue从Options API到Composition API的演进,也感受过Vue 3在性能上相比Vue 2的显著提升。现在,Vue团队正在开发一个…...
Parasoft C++Test软件单元测试_常见问题及处理
系列文章目录 Parasoft C++Test软件静态分析:操作指南(编码规范、质量度量)、常见问题及处理 Parasoft C++Test软件单元测试:操作指南、实例讲解、常见问题及处理 Parasoft C++Test软件集成测试:操作指南、实例讲解、常见问题及处理 进阶扩展:自动生成静态分析文档、自动…...
vue渲染数组各子项实现文本超出宽度显示tooltip
vue渲染数组各子项实现文本超出宽度显示tooltip 需求背景 vue项目中,通过v-for渲染数组,子项中均存在一行描述文字。当描述文字超出固定宽度时,显示省略号并且鼠标悬浮时显示tooltip;当描述文字不超出固定宽度时则正常显示&…...
libreoffice容器word转pdf
先说结论,市面上不花钱的,简单的效果好的就是这个种方式,在线测试下来不如命令转的效果好。AsposeWords和SpireDoc效果都不错,但是只有这个word转pdf感觉花3-5w不划算。 下载容器路径 https://docker.aityp.com/i/search?searchl…...
AI模型升级与机器人产业落地同步推进
2025年5月28日,中国AI领域迎来两项实质性进展。DeepSeek-R1模型完成小版本试升级,开源社区发布其0528版本。本次更新聚焦语义理解精准性、复杂逻辑推理和长文本处理能力的提升。在代码测试平台Live CodeBench中,开发者反馈其编程性能已接近Op…...
安全编码与AI接口权限控制
安全编码与AI接口权限控制 在AI系统中,模型服务的开放接口往往涉及敏感数据、核心算法与算力资源,如果缺乏有效的安全编码与权限控制机制,极易引发数据泄露、滥用调用或非法操作等问题。本节将从“接口安全策略”“权限验证流程”“Token管控机制”“多租户身份隔离”四个方…...

linux centos 服务器性能排查 vmstat、top等常用指令
背景:项目上经常出现系统运行缓慢,由于数据库服务器是linux服务器,记录下linux服务器性能排查常用指令 vmstat vmstat介绍 vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这…...
MySQL----视图的创造和使用
这里写目录标题 **创造视图****查看视图****修改视图****更新视图****删除视图** 创造视图 使用create view…创造 语法格式 create[algorithm {undefiend|merge|temptable}]view <视图名> [(<字段名1>[,……,字段名n])]as <select 语…...
c/c++的opencv伽马噪声
理解与实现 C/OpenCV 中的伽马噪声 🖼️ 噪声是大多数图像采集过程中固有的组成部分。理解和模拟不同类型的噪声对于开发鲁棒的图像处理算法至关重要,尤其是在去噪方面。虽然高斯噪声和椒盐噪声是常被讨论的类型,但伽马噪声(通常…...

LiveGBS国标视频平台收流模式:UDP、TCP被动与TCP主动传输模式之差异剖析
LiveGBS国标视频平台收流模式: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、原理 跳表是一种概率型数据结构,通过多层有序链表实现高效查找,时间复杂度接近平衡树(O(log n))。其核心思想是通过层级索引加速搜索,结构类似火车时刻表的“快车-慢车”模式。 关键特性: 多层链表&a…...
React从基础入门到高级实战:React 核心技术 - React 与 TypeScript:构建类型安全的应用
React 与 TypeScript:构建类型安全的应用 在现代前端开发中,TypeScript 因其强大的类型系统和编译时错误检查功能,已成为 React 开发者的热门选择。通过为代码添加类型定义,TypeScript 能够显著提升代码的健壮性、可维护性和团队…...
Django orm详解--组成部件
Django ORM 的核心部件可分为模型系统、查询系统、数据库后端和辅助工具四大类,每个部件负责不同的职责,共同实现对象与关系数据库的映射。以下是核心部件的分层解析: 一、模型系统(Model System) 1. 模型基类&#…...

Tomcat 使用与配置全解
一、 Tomcat简介 Tomcat服务器是Apache的一个开源免费的Web容器。它实现了JavaEE平台下部分技术规范,属于轻量级应用服务器。 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 发布 发布顺序任务 发布到新序列发布到当前(虚拟)主题 使用序列代替锁将多个任务发布到同一线程 发布到浏览器进程中的主线…...

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 示例的全过程。 📦 一、环境准备 1. 安装 Node.js Vue 项目依赖 Node.js 运行环境,请确保你的电脑已安装 Node.js(建议使用…...

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

STM32 SPI通信(软件)
一、SPI简介 SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(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. 地址管理模块 地址展示 前端:通过 showAddress() 发起 Ajax GET 请求,动态渲染地址列表表格,使用 #{tag}、#{name} 等占位符替换真实数据。 后端: 控制器层调用 AddressService,通过 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英文|化学结构编辑器|安装教程
软件下载 【名称】:ChemDraw 2023 【大小】:1.34G 【语言】:英文界面 【安装环境】:Win10/Win11 【夸克网盘下载链接】(务必手机注册): https://pan.quark.cn/s/320bcb67da80 【网站下载…...