android-gradle-pluginprotocprotobuf-java

protobuf gradle plugin does not compile


I'm trying to compile protobuf files using the gradle plugin, but I get the following error:

java.io.IOException: Can't write [/Users/elavi/dev/sdk3/android/showcaseapp/build/intermediates/multi-dex/debug/componentClasses.jar] 
(Can't read [/Users/elavi/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.0.0/6d325aa7c921661d84577c0a93d82da4df9fa4c8/protobuf-java-3.0.0.jar(;;;;;;**.class)] 
(Duplicate zip entry [protobuf-java-3.0.0.jar:com/google/protobuf/ExperimentalApi.class]))

Not sure why this happens... The protobuf files are generated correctly, as expected, but then the final step fails with this weird error.

This is my gradle file:

apply plugin: 'com.android.library'
apply plugin: 'com.google.protobuf'
apply plugin: 'idea'

group = GROUP
version = VERSION_NAME

apply from: 'versioning.gradle'

buildscript {
  repositories {
    mavenCentral()
  }
}

android {
  compileSdkVersion 26
  buildToolsVersion '26.0.2'
  flavorDimensions "default"

  defaultConfig {
    minSdkVersion 15
    targetSdkVersion 26
    versionCode buildVersionCode()
    versionName VERSION_NAME
    consumerProguardFiles 'tangram-proguard-rules.txt'
  }

  // Add proto files location to be used with the protobuf plugin
  sourceSets {
    main {
      proto {
        srcDir '../../common/vendored/proto'
      }
    }
  }
}

dependencies {
  compile 'com.google.protobuf:protobuf-lite:3.0.0'
  compile 'io.grpc:grpc-stub:1.6.1'
  compile 'io.grpc:grpc-protobuf:1.0.0-pre2'
  compile 'javax.annotation:javax.annotation-api:1.2'

  compile 'com.squareup.okhttp3:okhttp:3.9.0'
  compile 'com.android.support:support-annotations:27.0.0'

  implementation project(':core')
}

// Protobuf configuration. Taken from the documentation: https://github.com/google/protobuf-gradle-plugin
protobuf {

  protoc {
    artifact = 'com.google.protobuf:protoc:3.0.0'   }   plugins {
    javalite {
      artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
    }
    grpc {
      artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0-pre2'
    }   }   generateProtoTasks {
    all().each { task ->
      task.builtins {
        remove java
      }
      task.plugins {
        javalite { }
        grpc {
          option 'lite'
        }
      }
    }   }   generatedFilesBaseDir = "$projectDir/build/gen" }

clean {   delete protobuf.generatedFilesBaseDir }

idea {   module {
    sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/java");
    sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/grpc");   } }

//apply from: file('gradle-mvn-push.gradle')

I simply added what's written in the protobuf readme (https://github.com/google/protobuf-gradle-plugin), didn't do any fancy stuff...


Solution

  • maybe you should remove compile 'com.google.protobuf:protobuf-lite:3.0.0' entry on dependencies section, also you have duplicated entries and some config on last versions are missing. For other side maybe the path for proto sources have issues, my protos are src/main/proto but I only declared proto alone. My brief config is next:

    app build.gradle:

    apply plugin: 'com.google.protobuf'
    
    android {
        ...
        sourceSets {
            main {
              proto {
              }
            }
        }
        ...
        configurations.all {
          resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
        }
    }
    
    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
    
        implementation 'com.android.support:appcompat-v7:27.1.1'
        implementation 'io.grpc:grpc-okhttp:1.10.0'
        implementation 'io.grpc:grpc-protobuf-lite:1.10.0'
        implementation 'io.grpc:grpc-stub:1.10.0'
        implementation 'javax.annotation:javax.annotation-api:1.2'
        // full protobuf (optional)
        // protobuf 'com.google.protobuf:protobuf-java:3.4.0'
        ...
    
    }
    
    protobuf {
        protoc {
            artifact = "com.google.protobuf:protoc:3.0.2"
        }
        plugins {
            grpc {
                artifact = 'io.grpc:protoc-gen-grpc-java:1.1.2'
            }
            javalite {
                artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0"
            }
        }
        generateProtoTasks {
            all().each { task ->
                task.plugins {
                    javalite {}
                    grpc {
                        // Options added to --grpc_out
                        option 'lite'
                    }
                }
            }
        }
        generatedFilesBaseDir = "$projectDir/build/generated"
    }
    

    main project build.gradle:

    buildscript {
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.0'
            classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.2"
            ...
        }
    }