Protobuf gRPC - пакет google protobuf не существует

Я пытаюсь реализовать gRPC, и теперь у меня всевозможные проблемы, но я просто не понимаю, что делаю неправильно. Я слежу за этим документом: https://github.com/grpc/grpc-java/blob/master/README.md

И теперь у меня постоянно возникают такие ошибки, когда я пытаюсь собрать свой проект

error: package com.google.protobuf.GeneratedMessageV3 does not exist
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements

Во внешних библиотеках Android Studio у меня есть protobuf-java-3.12.1 jar.

В моем файле проекта gradle я добавил это в зависимости:

classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.14'

И в моем файле приложения gradle:

apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'

В зависимости я добавил:

implementation 'io.grpc:grpc-okhttp:1.35.0'
implementation 'io.grpc:grpc-protobuf-lite:1.35.0'
implementation 'io.grpc:grpc-stub:1.35.0'
compileOnly 'org.apache.tomcat:annotations-api:6.0.53'
implementation 'com.google.protobuf:protobuf-javalite:3.12.1'

И за пределами тега android:

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.12.1"
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.35.0'
        }
    }
    generateProtoTasks {
        all()*.plugins {
            grpc {}
        }
    }
}

Наконец, мой прото-файл:

syntax = "proto3";
import "google/protobuf/timestamp.proto"; 
option java_package = "com.xxx.xxx.proto.log";
option java_outer_classname = "MyClass";

message MyObject {
    string name = 1;
    string unit = 2;

    oneof value {
         bool bool_value = 3;
         sint32 int32_value = 4;
         uint32 u_int32_value = 5;
         google.protobuf.Timestamp timestamp_value = 6;
    }
}   

Когда я запускаю: protoc --version в терминале, это вывод:

libprotoc 3.12.1

Мне нужно добавить что-то еще, или я что-то пропустил в настройках Gradle?


person joe    schedule 03.02.2021    source источник


Ответы (1)


Похоже, вы надеетесь использовать protobuf lite (как обычно для проектов Android):

implementation 'io.grpc:grpc-protobuf-lite:1.35.0'
...
implementation 'com.google.protobuf:protobuf-javalite:3.12.1'

Однако в настоящее время вы генерируете полный код protobuf. Вам нужно указать генераторам кода java и grpc-java для генерации для lite через параметры. Как видно из grpc-java Android helloworld, пример:

protobuf {
    ...
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java { option 'lite' }
            }
            task.plugins {
                grpc { option 'lite' }
            }
        }
    }
}
person Eric Anderson    schedule 03.02.2021
comment
Создан github.com/grpc/grpc-java/pull/7865 для исправления документация. - person Eric Anderson; 03.02.2021
comment
Привет, Эрик, большое спасибо за вашу помощь, но, к сожалению, я все еще получаю те же ошибки ... - person joe; 04.02.2021
comment
Убедитесь, что вы не пропустили ни одного места, где требовалась эта опция. Сгенерированный Lite код расширяет GeneratedMessageLite. Итак, если вы видите GeneratedMessageV3, вы генерируете полный прототип кода. - person Eric Anderson; 04.02.2021
comment
Вероятно, это потому, что у меня уже были сгенерированы эти классы, и теперь, когда я хочу использовать gRPC с lite, он жалуется? Должен ли я тогда использовать полный прото-код? Может ли это работать вместе с gRPC? - person joe; 05.02.2021
comment
Наконец-то я смог заставить его работать! Я обновлю ответ ... проблема заключалась в назначении каталога прото-файла и способе создания прото-файла. Большое спасибо за помощь! - person joe; 05.02.2021