2

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...

ElyashivLavi
  • 1,681
  • 3
  • 22
  • 33

2 Answers2

4

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"
        ...
    }
}
Hpsaturn
  • 2,702
  • 31
  • 38
  • What if I just need to generate the full protobufs and not "lite"? So far every example I can find uses lite with no explanation of the options. I need the full Message class. I can generate them from the command line via protoc but can't figure out how to make gradle do it. – JamieB Feb 12 '19 at 21:13
  • I had the same issue, you only need add one line more: `protobuf 'com.google.protobuf:protobuf-java:3.4.0'` after `implementation` lines – Hpsaturn Feb 12 '19 at 22:33
1

I am not sure if this helps, but in my particular case of Gradle giving issue. The Error Image

This error I learned is mostly seen on the new M1 Chip Macs.

In my particular case, I just downgraded the version of protobuf to 3.18.0 And it worked.

if someone knows better, do edit my answer and add more information to it.

enter image description here

Prajval Singh
  • 501
  • 3
  • 9