使用IDEA作为gRPC的开发IDE,新建一个空的maven工程(不从archetype原型生成)。
创建完成之后,修改pom.xml,向其中添加gRPC-java的依赖和protoc插件项:
gRPC-java的依赖:
<dependencies>
<dependency>
<groupId>io.grpcgroupId>
<artifactId>grpc-allartifactId>
<version>${grpc-version}version>
dependency>
dependencies>
protocol buffers编译插件项:
<build>
<extensions>
<extension>
<groupId>kr.motd.mavengroupId>
<artifactId>os-maven-pluginartifactId>
<version>1.4.1.Finalversion>
extension>
extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.pluginsgroupId>
<artifactId>protobuf-maven-pluginartifactId>
<version>0.5.0version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}protocArtifact>
<pluginId>grpc-javapluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier}pluginArtifact>
configuration>
<executions>
<execution>
<goals>
<goal>compilegoal>
<goal>compile-customgoal>
goals>
execution>
executions>
plugin>
plugins>
build>
注意,这里我用的我自己编译生成,然后安装到本地Maven库中的grpc-all的jar包
因此,我这里写的是 1.1.0-SNAPSHOT
大家如果不想自己编译的话,可以使用目前Maven官方仓库中最新的版本:1.0.0。
第二点,注意这里的版本:
上边绿色字体的注释中规定,我们的protoc的版本要和protobuf-java jar包的版本一致。也就是说我们这里如果写了3.0.0(第一个红框内,注:我这里给出的例子使用的是3.0.0,而官方给出的是3.0.0-beta-3),那么下边这个地方也要是3.0.0:
这些都准备完成之后,我们可以在Maven本地仓库中看到,它会自动下载平台相关的相应版的protoc的exe程序,这里是3.0.0正式版的:
配置文件中给出的
${os.detected.classifier}
在我的机器上被解析为 windows-x86_64 了,这些都是上边的那个扩展插件的作用:
接下来,需要添加.proto文件。
打开Project Structure—》Modules,先在src/main目录下新建一个文件夹proto,用来存放我们马上将要创建的proto文件。
然后新建一个名叫hello.proto文件,按照官方教程中的样子,编写一个自定义的grpc服务。
编译.proto文件的工作由protoc的Maven插件编译来完成,它会调用指定路径下protoc.exe解析.proto,并生成我们编写客户端和服务端代码基础。
由于protoc可执行程序是平台相关的,因此这里给出两种配置方式:
1. 使用protobuf-maven-plugin自己指定的protc可执行程序。这种方式,什么都不用配置,只需要把plugin加进我们的pom.xml中就行了,插件会自己下载需要的可执行程序,在maven的本地仓库中,我们可以找到:
以及
下边的Download列表中选择你自己平台需要的可执行程序下载包进行下载,由于我是在windows平台上编译,所以我选择protoc-3.0.0-win32.zip:
完成之后,解压,可以看到bin下的exe执行文件:
说明你已经下载成功了,接着最后在我们的pom.xml中告诉protobuf-maven-plugin插件我们的可执行程序的路径:
注意:左侧我们在pom.xml中看到的有两个goal,此时选择第二个compile-custom,对hello.proto的修改在重新编译的时候才会生效,否则不会在target/generated-sources/protobuf/grpc-java目录下生成一个叫GreeterGrpc.java的文件。
编译提示:
然后执行compile goal生成HelloRequest、HelloReply等java类,在target/generated-sources/protobuf/java目录下。
编译提示:
target目录下的就是编译生成的结果:
最后,由于生成的代码中有
@java.lang.Override
这种注释,在JDK1.8中有问题,按住 Alt+Enter键,修改jdk语言级别为6:
由于我们上边规定了option:java_multiple_files为true,因此在编译完成之后,会生成多个Message类,它们并没有被包含在HelloProto.java文件中。
每个Message类,拿HelloRequest来说,它实现了Message和MessageOrBuilder接口:
由proto3语法定义的类继承自GeneratedMessageV3,实现了HelloRequestOrBuilder接口。
HelloRequestOrBuilder继承了MessageOrBuilder接口,这个类的代码非常简短:
另外一个比较重要的类是GreeterGrpc.java文件。