04-gRPC java 插件
在 pom 的 build 中配置了 proto 的编译插件,示例如下
1 |
|
配置一共用到了两个插件
os-maven-plugin
插件。该插件主要是为了识别不同的操作系统,这样插件可以根据不同的平台加载不同 protoc 编译器文件。
google 的 protobuf 团队也是用该插件来识别 protoc 的运行操作系统信息。${os.detected.classifier}
:这个变量获取操作系统的版本,例如osx-x86_64protobuf-maven-plugin 插件。java使用maven编译proto文件的插件。参数介绍如下。
详细的参数可以参考官方文档:Maven Protocol Buffers Plugin – protobuf:compileprotocArtifact:protoc 编译器工具的格式规范,
groupId:artifactId:version[:type[:classifier]]
。如果指定了该参数,protoc 将尝试按照指定的参数对文件 proto 文件进行编译’protocExecutable:配置 protoc 的编译执行程序的路径
protocPluginDirectory: protoc的执行文件目录
protoSourceRoot:原始proto文件的路径,比如
${project.basedir}/src/main/proto
outputDirectory:编译后生成
.java
文件的路径,比如:${project.basedir}/src/main/java
temporaryProtoFileDirectory:临时使用目录
clearOutputDirectory:设置是否在生成 java 文件之前清空 outputDirectory 的文件,默认值为 true,设置为 false 时也会覆盖同名文件
additionalProtoPathElement:附加的源 proto 文件定义路径,如果设备源路径没找到,会到该目录找
excludes:排除不需要编译的文件列表
includes:包含需要编译的proto文件列表,默认的
1
2
3<includes>
<include>**/*.proto</include>
</includes>
使用自定义编译插件编译 gRPC 服务
插件共有两个 gold:compile 和 compile-custom 。其中
compile 用来编译消息对象。
compile-custom 则依赖消息对象,生成接口服务。可以配置插件的信息,如下:
- pluginId: 唯一标识 protoc 的插件,不能为内置的 protoc 插件,比如
grpc-java
插件 - pluginArtifact: 识别插件版本
- pluginParameter:传递给插件的参数
这里我们主要配置了 gprc-java 插件,用来生成 grpc 服务的包
- pluginId: 唯一标识 protoc 的插件,不能为内置的 protoc 插件,比如
示例
我们先在工程目录下创建一个 lib 的 module,用来统一管理 proto 的包和编译后生成的 java 包。然后我们在跟 java 同级的目录创建 proto 的文件夹,用来存放.proto文件(如下图)
- 注意,这个文件夹位置是默认的。如果我们的 proto 文件不是放在
src/main/proto
位置,那么在配置插件的时候需要指定 proto 文件的位置,咱们本篇文章主要是入门,我这里就使用默认的位置。
然后在 proto 的 test 目录下,创建一个 hello.proto
的文件,内容如下
1 |
|
使用上述自定义插件的插件的 pom 配置,使用 maven compile 编译一下,我们可以看到编译的生成的包
然后我们即可 gPRC 的的服务端和客户端引用该包。
可能遇到的问题
配置了 goal: compile-custom 时,必须在
configuration
中配置<pluginId>grpc-java</pluginId>
插件,否则会报如下错误。The parameters 'pluginId' for goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1:compile-custom are missing or invalid
注意所有文件路径中不要使用中文