Protobuf Lite和Protobuf Java中的重复类

时间:2019-07-13 13:03:12

标签: android timestamp protocol-buffers grpc

我在Android实施中将grpc与protobuf lite一起使用。但是protobuf lite没有Google时间戳,我的protos已导入“ google / protobuf / timestamp.proto”。所以我添加了实现'com.google.protobuf:protobuf-java:3.7.1'到包含Google时间戳的gradle中。但是在此之后,代码编译就会出错。如在模块protobuf-java-3.7.1.jar(com.google.protobuf:protobuf-java:3.7.1)和protobuf-lite-3.0.1.jar(中找到的:duplicate class com.google.protobuf.AbstractMessageLite com.google.protobuf:protobuf-lite:3.0.1)。 任何解决此问题的想法将不胜感激。

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

android {
compileSdkVersion 28
buildToolsVersion "29.0.0"
defaultConfig {
    minSdkVersion 21
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

sourceSets {
    main {
        proto {
            srcDir 'src/main'
        }
        java {
            srcDir 'src/main'
        }
    }
}
}

protobuf {
protoc { artifact = 'com.google.protobuf:protoc:3.7.1' }
plugins {
    javalite { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
    grpc {
        artifact = 'io.grpc:protoc-gen-grpc-java:1.20.0' // CURRENT_GRPC_VERSION
    }
}

generateProtoTasks {
    all().each { task ->
        task.plugins {
            javalite {}
            grpc { // Options added to --grpc_out
                option 'lite'
            }
        }
    }
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.android.material:material:1.0.0'

// You need to build grpc-java to obtain these libraries below.
implementation 'io.grpc:grpc-okhttp:1.20.0'
implementation 'io.grpc:grpc-protobuf-lite:1.22.1'
implementation 'io.grpc:grpc-stub:1.20.0'
implementation 'javax.annotation:javax.annotation-api:1.3.2'
implementation 'com.google.protobuf:protobuf-java:3.7.1'
}

给出的错误是:

Duplicate class com.google.protobuf.AbstractMessageLite found in modules      protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
Duplicate class com.google.protobuf.AbstractMessageLite$Builder found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
Duplicate class com.google.protobuf.AbstractMessageLite$Builder$LimitedInputStream found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
Duplicate class com.google.protobuf.AbstractParser found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
 Duplicate class com.google.protobuf.AbstractProtobufList found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
 Duplicate class com.google.protobuf.BooleanArrayList found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
 Duplicate class com.google.protobuf.ByteBufferWriter found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
 Duplicate class com.google.protobuf.ByteOutput found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
 Duplicate class com.google.protobuf.ByteString found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
 Duplicate class com.google.protobuf.ByteString$1 found in modules protobuf-java-3.7.1.jar (com.google.protobuf:protobuf-java:3.7.1) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)

3 个答案:

答案 0 :(得分:4)

这件事发生在我身上,因为我添加了此依赖项:

implementation 'com.google.firebase:firebase-firestore-ktx:21.5.0'

最新版本的Firestore出现问题。截至2020年8月,使用21.4.2版本而不是21.5.0。

答案 1 :(得分:0)

缺少的类是known issue。完整原型和精简原型不能混合使用;他们使用不同的生成代码。不要将protobuf-java依赖于implementation,而依赖于protobuf依赖,这将导致gradle-protobuf-plugin为.protos生成代码。

dependencies {
  ...
  protobuf 'com.google.protobuf:protobuf-java:3.7.1'
}

请注意,此解决方案仅对应用程序有效。如果您是图书馆,这很危险,因为图书馆的用户随后可能会看到众所周知的原型的生成代码的多个副本。

答案 2 :(得分:0)

在我的情况下,这是因为混合包依赖性特别barcode_scan

此错误意味着您正在为您的项目导入两个使用 Protobuf 的包,其中一个的发行版与另一个冲突。

如果你在 Flutter 上遇到这个问题,你可以在 pubspec.yaml 中重新考虑你的依赖项的版本号,并将“any”替换为确切的版本号。 例如,在“依赖项:”下更改:

barcode_scan: any
To:

barcode_scan: ^2.0.0

希望能帮到你。