idea中grpc-java使用protobuf插件快速代码生成

在Idea项目中,如果文件路径包含中文,可能会导致protobuf插件在编译时出错。为避免此问题,可以确保项目路径不包含中文,并正确配置protobuf-maven-plugin插件,包括protocArtifact、pluginId、protoSourceRoot等参数。同时,确保Maven的protobuf版本、grpc版本以及相关依赖与项目兼容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

idea项目所在的文件路径不能包含中文
编译时再protobuf插件中分别点击 protobuf:compile、protobuf:compile-custom

依赖如下

<properties>
        <protobuf.version>3.13.0</protobuf.version>
        <os-maven-plugin.version>1.6.2</os-maven-plugin.version>
        <grpc.version>1.33.1</grpc.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring-boot-dependencies.version>2.7.11</spring-boot-dependencies.version>
        <spring-cloud-dependencies.version>2021.0.7</spring-cloud-dependencies.version>
        <spring-cloud-alibaba-dependencies.version>2021.0.5.0</spring-cloud-alibaba-dependencies.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
     <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		<!--grpc依赖-->
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>${grpc.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.re2j</groupId>
                    <artifactId>re2j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

 <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>${os-maven-plugin.version}</version>
            </extension>
        </extensions>
        <finalName>grpc-server-demo-two</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <!--protobuf插件-->
                <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>
                    <!--proto文件存放的位置,使用protobuf才能找到-->
                    <protoSourceRoot>src/main/resources/proto</protoSourceRoot>
                    <!--通过插件生成的协议代码存放地址-->
                    <!--<outputDirectory>${basedir}/src/main/java</outputDirectory>-->
                    <!--如果放在src下面,一定要false,不然你的代码都没了,输出放在resources就没关系-->
                    <!--<clearOutputDirectory>false</clearOutputDirectory>-->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!--分别执行protobuf插件中下面两个指令-->
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
### JavagRPCProtobuf使用教程及配置说明 #### 1. 工具安装与环境准备 为了在 Java使用 gRPCProtobuf,需要先准备好必要的工具和依赖项。确保已安装 `protoc` 编译器以及相应的插件用于生成 Java 类。 对于编译 `.proto` 文件并生成对应的 Java 源码,命令如下所示: ```bash protoc --plugin=protoc-gen-grpc-java=/path/to/protoc-gen-grpc-java.exe \ --grpc-java_out=. \ signaling_message.proto ``` 此操作会基于指定路径下的 `.proto` 文件创建所需的客户端和服务端接口代码[^1]。 #### 2. Maven 或 Gradle 配置 项目构建通常采用 Maven 或 Gradle 来管理依赖关系,在项目的 `pom.xml` 或者 `build.gradle` 文件中加入以下依赖声明以便引入 gRPCProtobuf 支持库: Maven 示例: ```xml <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> <!-- 如果是在IntelliJ IDEA环境中 --> <dependency> <groupId>io.grpc</groupId> <artifactId>protoc-gen-grpc-java</artifactId> <classifier>${os.detected.classifier}</classifier> <version>${grpc.version}</version> </dependency> ``` Gradle 示例: ```groovy dependencies { implementation 'io.grpc:grpc-netty-shaded:${grpc_version}' implementation 'io.grpc:grpc-protobuf:${grpc_version}' implementation 'io.grpc:grpc-stub:${grpc_version}' } ``` 上述设置允许开发者利用这些库来进行高效的 RPC 调用,并处理由 Protobuf 定义的消息结构[^3]。 #### 3. .proto 文件编写指南 `.proto` 文件是用来描述通信协议的数据格式和服务接口的关键部分。下面是一个简单的例子展示了如何定义一个基本的服务及其请求响应消息体: ```protobuf syntax = "proto3"; option java_multiple_files = true; option java_package = "com.example.grpc"; option java_outer_classname = "ExampleProto"; package example; service ExampleService { rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } ``` 这段代码片段定义了一个名为 `SayHello` 的远程过程调用方法,它接收包含姓名字段的请求,并返回一条问候语作为回应[^5]。 #### 4. 实现服务端逻辑 一旦有了 `.proto` 文件中的定义之后就可以着手于具体业务实现了。这里给出一段简化版的服务端实现方式: ```java public class HelloWorldServer { private Server server; private void start() throws IOException { int port = 50051; this.server = ServerBuilder.forPort(port) .addService(new GreeterImpl()) .build() .start(); System.out.println("Server started, listening on " + port); Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { HelloWorldServer.this.stop(); } catch (InterruptedException e) { e.printStackTrace(System.err); } })); } public static void main(String[] args) throws IOException, InterruptedException { final HelloWorldServer server = new HelloWorldServer(); server.start(); server.blockUntilShutDown(); } // ...其他辅助函数... private void stop() throws InterruptedException { if (server != null && !server.isShutdown()) { server.shutdown().awaitTermination(30, TimeUnit.SECONDS); } } /** * Await termination on the built-in channel executor. */ private void blockUntilShutDown() throws InterruptedException { if (server != null) { server.awaitTermination(); } } } ``` 在此基础上还需要提供具体的业务处理器类比如上面提到的 `GreeterImpl` ,该类需继承自框架所提供的抽象基类并重写相应的方法来完成特定的任务处理流程[^2]。 #### 5. 测试与验证 最后一步就是测试整个系统的连通性和功能性了。可以借助官方提供的命令行工具或者其他第三方客户端模拟真实场景下发起请求的过程;也可以自行开发简易版本的应用程序充当临时性的测试平台以检验各项功能是否正常运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值