Android 渐变依赖版本冲突

Android 渐变依赖版本冲突,android,android-studio,gradle,Android,Android Studio,Gradle,我有以下依赖项脚本: apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.asdf.asdf" minSdkVersion 10 targ

我有以下依赖项脚本:

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

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.asdf.asdf"
        minSdkVersion 10
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    buildTypes.each {
        it.buildConfigField 'String', 'YOUTUBE_API_KEY', YoutubeApiKey
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0-beta-2'
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:0.13.2'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                javanano {
                    option 'ignore_services=true'
                }
            }

            task.plugins {
                grpc {
                    option 'nano=true'
                }
            }
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.mcxiaoke.volley:library:1.0.19'
    compile 'com.android.support:design:23.2.1'
    compile 'com.android.support:support-v4:23.2.1'
    compile 'com.android.support:cardview-v7:23.2.1'
    compile 'com.android.support:support-annotations:23.2.1'
    compile 'com.android.support:customtabs:23.2.1'
    compile 'com.google.apis:google-api-services-youtube:v3-rev164-1.21.0'
    compile 'javax.annotation:javax.annotation-api:1.2'
    compile 'io.grpc:grpc-protobuf-nano:0.13.2'
    compile 'io.grpc:grpc-okhttp:0.13.2'
    compile 'io.grpc:grpc-stub:0.13.2'
    compile 'com.google.guava:guava:18.0'
}
虽然youtube库和grpc库都依赖于google guava库,但它们依赖于不同的版本,从而导致冲突。Youtube依赖于
com.google.guava:guava-jdk5:17.0
com.google.guava:guava:18.0
上的grpc(注意工件的差异,如果可能相关的话)。问题是grpc最终试图找到Youtube版本的guava中定义的方法,而它只存在于自己版本的依赖关系中。我如何解决这个问题

错误消息

FATAL EXCEPTION: SyncAdapterThread-1
    Process: com.asdf.asdf, PID: 4025
             java.lang.NoSuchMethodError: No static method directExecutor()Ljava/util/concurrent/Executor; in class Lcom/google/common/util/concurrent/MoreExecutors; or its super classes (declaration of 'com.google.common.util.concurrent.MoreExecutors' appears in /data/data/com.fentale.dalol/files/instant-run/dex/slice-guava-jdk5-17.0_a8ada10dcaf113cb6e3b4d3e5b46975833f8ae8f-classes.dex)
                at io.grpc.internal.ClientCallImpl.<init>(ClientCallImpl.java:100)
                at io.grpc.internal.ManagedChannelImpl$RealChannel.newCall(ManagedChannelImpl.java:320)
                at io.grpc.internal.ManagedChannelImpl.newCall(ManagedChannelImpl.java:299)
                at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:130)
                at com.fentale.dalol.nano.DalolGrpc$DalolBlockingStub.topPosts(DalolGrpc.java:365)
致命异常:SyncAdapterThread-1
进程:com.asdf.asdf,PID:4025
java.lang.NoSuchMethodError:没有静态方法directExecutor()Ljava/util/concurrent/Executor;类内Lcom/google/common/util/concurrent/MoreExecutors;或者它的超类(声明'com.google.common.util.concurrent.MoreExecutors'出现在/data/data/com.fentale.dalol/files/instant run/dex/slice-guava-jdk5-17.0_A8;a10dcaf113cb6e3b4d3e5b4697583f8f-classes.dex中)
位于io.grpc.internal.ClientCallImpl.(ClientCallImpl.java:100)
在io.grpc.internal.ManagedChannelImpl$RealChannel.newCall(ManagedChannelImpl.java:320)
在io.grpc.internal.ManagedChannelImpl.newCall(ManagedChannelImpl.java:299)
在io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:130)
在com.fentale.darol.nano.DalolGrpc$DalolBlockingStub.topPosts(DalolGrpc.java:365)

guava-v18中定义了“directExecutor”方法,但grpc尝试从
guava-jdk5

手动指定guava版本

compile 'com.google.guava:guava:18.0.0' 
因此,您的依赖关系将如下所示

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.google.apis:google-api-services-youtube:v3-rev164-1.21.0'
    compile 'javax.annotation:javax.annotation-api:1.2'
    compile 'io.grpc:grpc-protobuf-nano:0.13.2'
    compile 'com.google.guava:guava:18.0.0' 
}
这样,您将强制使用番石榴v18

或者在顶级gradle中,您可以使用

configurations.all {
    resolutionStrategy.force 'com.google.guava:guava:18.0.0'
}

我会尝试通过使用

exclude module: 'guava-jdk5'
在您的依赖项中


问题是,如果工件具有不同的名称(如此处的guava和guava-jdk5),则无法检测到版本冲突。由于两个JAR都包含在内,因此可能会加载错误的类。

您必须编辑项目级别build.gradle

exclude module: 'guava-jdk5'
内部依赖项。请查看附加的屏幕截图以了解更多详细信息 如果您正在使用firebase插件,请添加

classpath ('com.google.firebase:firebase-plugins:1.1.0') {
        exclude group: 'com.google.guava', module: 'guava-jdk5'
    }

请粘贴错误消息。请尝试删除错误消息的最后一行gradle@barq我根据您的指示添加了最后一行(番石榴依赖项)。不起作用。还尝试在项目构建中强制执行,结果相同。谢谢。编译('com.google.api:google-api-services-youtube:v3-rev164-1.21.0'){exclude module:'guava-jdk5'}就是这样做的。我尝试对Firebase和youtube使用
exclude group:'com.google.guava',module:'guava-jdk5')}
。这似乎应该是可行的,因为错误来自Firebase:com.google.cloud.firestore.FirestoreImpl.streamRequest(FirestoreImpl.java:339)com.google.cloud.firestore.Query.stream(Query.java:955)com.google.cloud.firestore.Query.get(Query.java:995)com.google.cloud.firestore.Query.get(Query.java:965)位于content.Task.getQueryParams(ContentTasks.kt:69)处的content.Task.run(ContentTasks.kt:54)