Рубрики
Без рубрики

Настройте Gradle для генерации Java-кода из Protobuf

В прошлой лекции мы закончили писать наши протокольные буферные сообщения и генерировать из них коды Go… С пометкой grpc, java, учебное пособие, для начинающих.

В прошлой лекции мы закончили писать наши протокольные буферные сообщения и генерировать из них коды Go. Сегодня мы собираемся сделать то же самое для Java.

Вот ссылка на полный плейлист курса gRPC на Youtube Репозиторий Github: pcbook-go и pcbook-java Репозиторий Gitlab: pcbook-go и pcbook- Ява

Мы создадим новый проект Gradle, настроим некоторые плагины и настроим их так, чтобы они автоматически генерировали Java-код всякий раз, когда проект создается. Мы также узнаем, как использовать опцию для настройки сгенерированных кодов.

Хорошо, давайте начнем!

Новый проект Gradle

Во-первых, убедитесь, что на вашем компьютере уже установлены Java Development Kit и IntelliJ IDEA.

Откройте IntelliJ IDEA и создайте новый проект. Мы будем использовать Gradle, потому что у Google есть официальный плагин Gradle для protocol buffer. Для project SDK убедитесь, что выбрана правильная версия Java. Это должна быть как минимум Java 8. Затем нажмите кнопку Далее.

Заполните идентификатор группы, идентификатор артефакта. Проверьте название проекта и его местоположение, чтобы они были именно такими, как вы хотите. Затем нажмите кнопку Готово. Настройка проекта IntelliJ IDEA может занять несколько секунд.

Config protobuf-плагин gradle

Теперь мы откроем файл build.gradle для настройки некоторых плагинов. Первый из них – protobuf-gradle плагины от Google.

Откройте эту страницу Github , прокрутите немного вниз, скопируйте блок плагинов и вставьте его в наш файл 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'
}

Добавить зависимость 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 . Его следует найти по адресу this page .

Выберите последнюю версию ( 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 будет искать исполняемый файл protocol в системе. Мы уже установили его в предыдущей лекции с Homebrew. Однако, если вы пришли сюда непосредственно за Java, я покажу вам другой способ получить предварительно скомпилированный protocol .

Сначала перейдите в репозиторий maven и найдите protocol . Его можно найти на этой странице .

Выберите последнюю версию ( 3.10.1 в моем случае), но не добавляйте его в блок зависимостей, как раньше. Вместо этого мы настроим его в отдельном блоке.

Давайте вернемся на страницу protobuf-gradle-plugin github и скопируем этот блок настроек:

Вставьте его в наш файл 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'
    }
}

Скажите протоколу использовать плагин gRPC

Теперь очень важная вещь, которую мы должны сделать, – это указать protocol использовать плагин gRPC при генерации кода Java. Мы можем сделать это, вернувшись на страницу github protobuf-gradle-plugin и поищите этот блок плагинов.

Существует артефакт для protocol-gen-grpc-java , мы можем найти его последнюю версию в репозитории maven .

В моем случае это 1.25.0, поэтому давайте скопируем и вставим блок конфигурации в файл 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 {}
        }
    }
}

Мы также должны добавить generateprototask настройки для руководства

Я знаю, что это выглядит сложно, и в нем слишком много материалов, но это поможет нам значительно ускорить этап разработки.

Где расположены сгенерированные коды

Осталось сделать еще одну вещь, прежде чем мы сможем приступить к работе, а именно сообщить IntelliJ IDEA, где будут находиться наши сгенерированные коды. Таким образом, он может легко и правильно выполнять анализ кода и предлагать код для нас позже.

Для этого мы используем исходные наборы блок. И внутри этого блока мы указываем 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

Папка grpc сейчас пуста, потому что мы еще не написали ни одного RPC. В папке java находится 6 файлов Java, по одному для каждого из сообщений.

Есть много кодов в одном файле. И сгенерированное имя пакета совпадает с именем пакета protobuf: tech school.pcbook . Мы можем легко изменить это имя пакета аналогично тому, что мы сделали для Go с помощью этого параметра:

option java_package="com.gitlab.techschool.pcbook.pb"

Мы также можем указать протоколу разбивать коды на более мелкие файлы вместо того, чтобы помещать их в один большой файл. Это довольно просто, просто установите:

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.

Спасибо за чтение и до встречи!

Если вам понравилась статья, пожалуйста подпишитесь на наш канал Youtube и следите за нами в Twitter для получения дополнительных руководств в будущем.

Если вы хотите присоединиться ко мне в моей нынешней удивительной команде в Voodoo, ознакомьтесь наши вакансии здесь . Удаленно или на месте в Париже/Амстердаме/Лондоне/Берлине/Барселоне при спонсорской поддержке visa.

Оригинал: “https://dev.to/techschoolguru/config-gradle-to-generate-java-code-from-protobuf-1cla”