Создание класса java из proto-buf (без использования protobuf-lite)

Мне удалось сгенерировать код protobuf для java с использованием java-lite, проблема в том, что мне нужен простой 'java'

Уровень проекта:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath "com.android.tools.build:gradle:4.1.0"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Уровень модуля:

plugins {
    id 'com.android.application'
    id "com.google.protobuf" version "0.8.13"
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.maartin.myapplication"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    sourceSets.main.java.filter.exclude 'META-INF/**/*'

    packagingOptions {
        exclude 'META-INF/**/*'
    }
}

dependencies {
    implementation 'com.android.support.constraint:constraint-layout:2.0.3'
    implementation "androidx.appcompat:appcompat:1.2.0"
    testImplementation 'junit:junit:4.13.1'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation  "androidx.datastore:datastore-core:1.0.0-alpha02"

    implementation  "com.google.protobuf:protobuf-javalite:3.13.0"
}

sourceSets {
    main {
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
            srcDir 'src/main/proto'
        }
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.10.0'
    }

    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option 'lite'
                }
            }
        }
    }
}

Код сверху работает безупречно, но генерирует javalite версию. Как я могу сгенерировать простую Java?

Что я пробовал:

Уровень проекта: stays the same

Уровень модуля:

plugins {
    id 'com.android.application'
    id "com.google.protobuf" version "0.8.13"
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.maartin.myapplication"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    packagingOptions {
        pickFirst "META-INF/io.netty.versions.properties"
        pickFirst "META-INF/INDEX.LIST"

        exclude 'META-INF/*'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/INDEX.LIST'


        exclude 'META-INF/native-image/io.netty/transport/native-image.properties'
        exclude 'META-INF/native-image/io.netty/codec-http2/native-image.properties'
        exclude 'META-INF/native-image/io.netty/codec-http2/*'
        exclude 'META-INF/native-image/io.netty/codec-http2/*'
        exclude 'META-INF/native-image/io.netty/buffer/native-image.properties'
        exclude 'META-INF/native-image/io.netty/handler/native-image.properties'
        exclude 'META-INF/native-image/io.netty/*'
        exclude 'META-INF/native-image/io.netty/common/native-image.properties'
        exclude 'META-INF/native-image/io.netty/transport/reflection-config.json'
        exclude 'META-INF/native-image/io.netty/codec-http/native-image.properties'

        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
        exclude("META-INF/*.kotlin_module")
    }

    sourceSets.main.java.filter.exclude 'META-INF/**/*'

    packagingOptions {
        exclude 'META-INF/**/*'
    }
}

dependencies {
    implementation 'com.android.support.constraint:constraint-layout:2.0.3'
    implementation "androidx.appcompat:appcompat:1.2.0"
    testImplementation 'junit:junit:4.13.1'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation  "androidx.datastore:datastore-core:1.0.0-alpha02"

    implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.12.0'
    implementation group: 'io.grpc', name: 'grpc-all', version: '1.29.0'
}

sourceSets {
    main {
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
            srcDir 'src/main/proto'
        }
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.11.0'
    }

    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.29.0'
        }
    }

    generateProtoTasks {
        all()*.plugins {
            grpc {
                outputSubDir = 'java'
            }
        }
    }
}

При новом подходе - у меня нет ошибок, но у build/generated/source/proto есть только папка отладки (файлы java не генерируются)


person MaartinAndroid    schedule 28.10.2020    source источник


Ответы (1)


Я подозреваю, что следующая часть проблематична.

grpc {
    outputSubDir = 'java'
}

Он заменяет имя каталога вывода для плагина grpc на java. Однако каталог java является каталогом по умолчанию для встроенной java. Следствием этого является то, что сгенерированный код службы gRPC перезаписывает сгенерированный код сообщения Java. Можете попробовать поменять его на что-нибудь другое или просто оставить по умолчанию?

person voidzcy    schedule 28.10.2020
comment
Я оставил поле grpc {} пустым. Теперь он генерирует только пустую папку build / generated / source / proto / debug / grpc. - person MaartinAndroid; 29.10.2020
comment
Вы должны увидеть два каталога: build / created / source / proto / debug / grpc и build / generated / source / proto / debug / java. Первый содержит сгенерированный код gRPC (только если вы определили службы RPC в своем прототипе, иначе он будет пустым), а последний содержит сгенерированный код для сообщений protobuf. - person voidzcy; 29.10.2020
comment
По какой-то причине у меня только одна папка в build / generated / source / proto / debug, и она grpc - пустая, как и должно быть. Какая конфигурация мне здесь не хватает? - person MaartinAndroid; 30.10.2020
comment
Что еще вы изменили по сравнению со сборкой для джавалита? Я видел, как вы добавили gRPC. Куда вы помещаете свои прото-файлы? - person voidzcy; 30.10.2020