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