在上一讲中,我们已完成编写协议缓冲区消息并从中生成Go代码。 今天,我们将对Java执行相同的操作。
这是Youtube
Gitlab存储库上完整的gRPC课程播放列表的链接:pcbook-go和pcbook-java
我们将创建一个新的Gradle项目,设置一些插件并将其配置为在构建项目时自动生成Java代码。 我们还将学习如何使用选项来自定义生成的代码。
好的,让我们开始吧!
新Gradle项目
首先,请确保您已经在计算机上安装了Java Development Kit和IntelliJ IDEA。
打开IntelliJ IDEA并创建一个新项目。 我们将使用Gradle,因为Google拥有用于协议缓冲区的官方Gradle插件。 对于项目SDK,请确保选择了正确的Java版本。 至少应为Java8。然后单击“下一步”。
填写GroupID,工件ID。 检查项目名称及其位置是否正是您想要的。 然后单击完成。 IntelliJ IDEA可能需要几秒钟来设置项目。
配置protobuf-gradle插件
现在我们将打开build.gradle文件来设置一些插件。 第一个是来自谷歌的protobuf-gradle插件。
打开此Github页面,向下滚动一点,复制plugins块并将其粘贴到我们的build.gradle file:
plugins {
id "com.google.protobuf" version "0.8.10"
id "java"
}
group 'com.gitlab.techschool'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
添加protobuf-java依赖项
接下来,我们需要添加一个依赖性:protobuf-java我们的项目。让我们打开这个Maven仓库页面。
这是protobuf-java的神器com.google.protobuf包。 让我们选择最新版本:3.10.0
单击Gradle选项卡并复制设置,然后将其粘贴到我们的依赖性模块中build.gradle文件:
plugins {
id "com.google.protobuf" version "0.8.10"
id "java"
}
group 'com.gitlab.techschool'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
// https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.10.0'
}
添加grpc-all依赖项
我们还将需要一个软件包来与gRPC一起使用。因此,让我们回到Maven存储库并搜索grpc-all。应该在此页面上找到。
选择最新版本(1.25.0就我而言)。 与之前类似,打开Gradle标签并复制设置,然后将其粘贴到我们的依赖性模块中build.gradle文件。 IntelliJ IDEA将自动为我们检测并配置它。
plugins {
id "com.google.protobuf" version "0.8.10"
id "java"
}
group 'com.gitlab.techschool'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
// https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.10.0'
// https://mvnrepository.com/artifact/io.grpc/grpc-all
compile group: 'io.grpc', name: 'grpc-all', version: '1.25.0'
}
设置protobuf编译器
现在,我们将设置protobuf编译器。 默认情况下,protobuf-gradle-plugin将搜寻协议在系统中可执行。 我们已经在以前的Homebrew讲座中安装了它。 但是,如果您直接来这里学习Java,我将向您展示另一种获得预编译方式的方法协议。
我们还将需要一个软件包来与gRPC一起使用。因此,让我们回到Maven存储库并搜索grpc-all。应该在此页面上找到。
选择最新版本(3.10.1就我而言),但不要像以前一样将其添加到依赖项块中。 相反,我们将在单独的块中对其进行配置。
让我们回到protobuf-gradle-plugingithub页面,并复制此设置块:
粘贴到我们的build.gradle文件,将其替换为上面找到的最新版本,IntelliJ将负责其余的工作。
plugins {
id "com.google.protobuf" version "0.8.10"
id "java"
}
group 'com.gitlab.techschool'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
// https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.10.0'
// https://mvnrepository.com/artifact/io.grpc/grpc-all
compile group: 'io.grpc', name: 'grpc-all', version: '1.25.0'
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.10.1'
}
}
告诉protoc使用gRPC插件
现在,我们应该做的一件非常重要的事情是协议在生成Java代码时使用gRPC插件。 我们可以通过返回的github页面来实现protobuf-gradle-plugin并寻找这个插件块。
有一个工件protoc-gen-grpc-java,我们可以在maven存储库中搜索其最新版本。
在我的情况下是1.25.0,所以让我们将config块复制并粘贴到build.gradle文件中,然后将版本更改为1.25.0:
plugins {
id "com.google.protobuf" version "0.8.10"
id "java"
}
group 'com.gitlab.techschool'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
// https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.10.0'
// https://mvnrepository.com/artifact/io.grpc/grpc-all
compile group: 'io.grpc', name: 'grpc-all', version: '1.25.0'
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.10.1'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.25.0'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
}
}
我们还应该添加generateProtoTasks指导设置协议使用gRPC插件。
我知道它看起来很复杂并且有太多东西,但这将帮助我们在开发阶段加快很多速度。
生成的代码所在的位置
在我们做好准备之前还剩下一件事,那就是告诉IntelliJ IDEA我们生成的代码将位于何处。 这样,它可以在以后轻松,正确地为我们进行代码分析和代码建议。
为此,我们使用sourceSets块。 在此块中,我们指定2个源目录:1个用于gRPC,另一个用于常规protobuf消息:
plugins {
id "com.google.protobuf" version "0.8.10"
id "java"
}
group 'com.gitlab.techschool'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
// https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.10.0'
// https://mvnrepository.com/artifact/io.grpc/grpc-all
compile group: 'io.grpc', name: 'grpc-all', version: '1.25.0'
}
sourceSets {
main {
java {
srcDirs 'build/generated/source/proto/main/grpc'
srcDirs 'build/generated/source/proto/main/java'
}
}
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.10.1'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.25.0'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
}
}
好,现在我们真的很高兴!
生成Java代码
让我们在其中创建一个新的proto文件夹src / main。 然后将我们在以前的讲座中编写的所有原型文件复制到此文件夹。
现在介绍有趣的部分。 单击“生成”图标后,IntelliJ IDEA将启动一些后台任务来为我们生成代码。 完成后,我们可以在此文件夹中找到生成的代码:
build/generated/source/proto/main/java
rpc文件夹现在是空的,因为我们还没有编写任何RPC。在java文件夹中,有6个java文件,每个消息一个。
一个文件中有很多代码。 生成的包名称与protobuf包相同:技术学校。 通过此设置,我们可以轻松更改此软件包名称,类似于我们对Go所做的操作:
option java_package="com.gitlab.techschool.pcbook.pb"
我们还可以告诉protoc将代码拆分为较小的文件,而不是将其放入一个大文件中。 这很简单,只需设置:
option java_multiple_files = true;
这些选项应添加到所有原始文件中。 例如,laptop_message.proto文件将是这样的:
syntax = "proto3";
package techschool.pcbook;
option go_package = "pb";
option java_package = "com.gitlab.techschool.pcbook.pb";
option java_multiple_files = true;
import "processor_message.proto";
import "memory_message.proto";
import "storage_message.proto";
import "screen_message.proto";
import "keyboard_message.proto";
import "google/protobuf/timestamp.proto";
message Laptop {
string id = 1;
string brand = 2;
string name = 3;
CPU cpu = 4;
Memory ram = 5;
repeated GPU gpus = 6;
repeated Storage storages = 7;
Screen screen = 8;
Keyboard keyboard = 9;
oneof weight {
double weight_kg = 10;
double weight_lb = 11;
}
double price_usd = 12;
uint32 release_year = 13;
google.protobuf.Timestamp updated_at = 14;
}
现在,如果我删除旧的生成的代码并重建项目,将有许多Java文件,并且包名称将更改为我们想要的名称。
就是这样! 大功告成!
在下一个演讲中,我们将开始用Go和Java编写代码以将protobuf消息序列化为二进制和JSON。
感谢您的阅读,再见!
from: https://dev.to//techschoolguru/config-gradle-to-generate-java-code-from-protobuf-1cla