我在依赖google guava库的android应用中使用google的grpc库。由于某种原因,嵌入在grpc中的 Guava 在MoreExecutors.类中没有'directExecutor'方法,但是该方法存在于github版本中吗?造成差异的原因是什么?

在名为ClientCallImpl的类中,将进行对directExecutor的调用。在import语句(import static com.google.common.util.concurrent.MoreExecutors.directExecutor;)上,AndroidStudio显示can't resolve symbol消息,但构建不会失败。在执行期间进行调用时会引发异常。

错误消息

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)

编辑

看来问题在于我的项目同时依赖guava-18.0guava-jdk5-17.0.。我想要directExecutor的方法仅在guava-18的MoreExecutors类中定义,而不是17。但是代码在该类的后一版本中寻找它。我该如何解决。

最佳答案

我的应用程序依赖于YouTube库,而YouTube库又依赖于 Guava 。但是,YouTube的 Guava 依赖项来自与grpc不同的来源,并且使用的是旧版本。应用程序中存在两个版本的 Guava jar ,grpc正在访问youtube的较早版本的 Guava ,而不是自己的版本,这导致了问题。

compile('com.google.apis:google-api-services-youtube:v3-rev164-1.21.0') {
    exclude module: 'guava-jdk5'
}

关于android - Guava 库中缺少directExecutor方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36399352/

10-12 01:50