配置 Gradle 从 Protobuf 生成 Java 代码

在上一讲中,我们已完成编写协议缓冲区消息并从中生成Go代码。 今天,我们将对Java执行相同的操作。

这是Youtube
Gitlab存储库上完整的gRPC课程播放列表的链接:pcbook-gopcbook-java

我们将创建一个新的Gradle项目,设置一些插件并将其配置为在构建项目时自动生成Java代码。 我们还将学习如何使用选项来自定义生成的代码。

好的,让我们开始吧!

新Gradle项目

首先,请确保您已经在计算机上安装了Java Development Kit和IntelliJ IDEA。

New Gradle project

打开IntelliJ IDEA并创建一个新项目。 我们将使用Gradle,因为Google拥有用于协议缓冲区的官方Gradle插件。 对于项目SDK,请确保选择了正确的Java版本。 至少应为Java8。然后单击“下一步”。

Fill in GroupID and ArtifactID

填写GroupID,工件ID。 检查项目名称及其位置是否正是您想要的。 然后单击完成。 IntelliJ IDEA可能需要几秒钟来设置项目。

Fill in project name and location

配置protobuf-gradle插件

现在我们将打开build.gradle文件来设置一些插件。 第一个是来自谷歌的protobuf-gradle插件。

Protobuf Gradle plugin

打开此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

Add protobuf-java dependency

单击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。应该在此页面上找到。

Add grpc-all dependency

选择最新版本(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页面,并复制此设置块:

Config protoc

粘贴到我们的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并寻找这个插件块。

Tell protoc to use gRPC 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。 然后将我们在以前的讲座中编写的所有原型文件复制到此文件夹。

Copy proto files

现在介绍有趣的部分。 单击“生成”图标后,IntelliJ IDEA将启动一些后台任务来为我们生成代码。 完成后,我们可以在此文件夹中找到生成的代码:

build/generated/source/proto/main/java

rpc文件夹现在是空的,因为我们还没有编写任何RPC。在java文件夹中,有6个java文件,每个消息一个。

Generated Java code

一个文件中有很多代码。 生成的包名称与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文件,并且包名称将更改为我们想要的名称。

Multiple Java files and custom package name

就是这样! 大功告成!

在下一个演讲中,我们将开始用Go和Java编写代码以将protobuf消息序列化为二进制和JSON。

感谢您的阅读,再见!

from: https://dev.to//techschoolguru/config-gradle-to-generate-java-code-from-protobuf-1cla