gpt4 book ai didi

apache-spark - 如何解决由于使用gradle或其他任何东西使用两个不同版本的同一个库而引起的NoMethodError?

转载 作者:行者123 更新时间:2023-12-03 03:49:39 26 4
gpt4 key购买 nike

我有两个依赖关系,它们使用相同的库但具有不同的版本,并且出现NoMethodError。我不确定如何使用gradle或其他方式解决它?任何帮助都会很棒

group 'com.hello'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'idea'

repositories {
mavenCentral()
mavenLocal()
}


dependencies {
compile 'org.slf4j:slf4j-log4j12:1.7.12'
compile group: 'org.apache.spark', name: 'spark-core_2.11', version: '2.0.1'
compile group: 'org.apache.spark', name: 'spark-streaming_2.11', version: '2.0.1'
compile group: 'org.apache.spark', name: 'spark-streaming-kafka-0-10_2.11', version: '2.0.1'
compile group:'org.apache.kafka', name: 'kafka-clients', version: '0.10.1.0'
compile group: 'com.datastax.spark', name: 'spark-cassandra-connector_2.11', version: '2.0.0-M3'
compile group: 'com.github.brainlag', name: 'nsq-client', version: '1.0.0.RC2'
compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
}


task buildStreamingJar(type: Jar) {
if(project.hasProperty("jarname")) {
def fullyQualifiedPackageName = ""
def jarname = project.getProperty("jarname")
if (jarname.equalsIgnoreCase("SparkDriver1")) {
fullyQualifiedPackageName = "com.hello.streamprocessing.app.SparkDriver1"
}
if (jarname.equalsIgnoreCase("SparkDriver2")) {
fullyQualifiedPackageName = "com.hello.streamprocessing.app.SparkDriver2"
}

baseName = project.name + "-$jarname" + "-stream"
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
zip64 true
from sourceSets.test.output
manifest {
attributes 'Main-Class': fullyQualifiedPackageName
}
exclude 'META-INF/.RSA', 'META-INF/.SF', 'META-INF/*.DSA'
}
}

,所以这里发生的是在我的依赖项中spark-core_2.11使用
com.google.guava:14.0.1,并且nsq-client使用com.google.guava:19.0


这导致以下错误。
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()Ljava/util/Set;
at com.github.brainlag.nsq.NSQProducer.(NSQProducer.java:22)
at com.hello.streamprocessing.app.SparkDriver2.main(SparkDriver2.java:37)

我需要使用此build.gradle文件来构建FAT Uber jar,以便可以将其与spark-submit一起使用

最佳答案

基本上,如果spark-corensq-client使用的是某个版本或另一个版本中不存在的guava功能,则基本上无法解决此问题。您可以运行gradlew dependencies,它将显示gradle如何解决guava上的版本冲突。默认情况下,它将选择版本19.0作为其较新版本。最好的机会是使用依赖于guava相同版本的库版本。如果可能的话,要么降级nsq-client要么升级spark-core

您可以像这样将传递依赖项排除在guava之外:

dependencies {
...
compile (group: 'com.github.brainlag', name: 'nsq-client', version: '1.0.0.RC2') {
exclude group: 'com.google.guava', module: 'guava'
}
...
}

但是,这仅在 nsq-client不依赖于仅上述 Guava 的 19.0版本中存在的功能的情况下才有效。

遗憾的是,这是一个常见的问题,尤其是对于 guava库,因为它几乎在每个项目中都使用,并且开发人员不太在乎其库的稳定API。

最好的选择可能是尝试从 guava中排除 spark-core并尝试一下,如果它不起作用,则将其从 nsq-client中排除并尝试一下。但是,即使乍看之下似乎效果不错,但在应用程序运行期间也会遇到类似的问题。

如果上述方法不起作用,您仍然可以派生 nsq-client并用与 guava 14.0.1兼容的部件替换有问题的部件。我不太喜欢这个选项,但是如果 nsq-client的开发人员很好,他们可能会接受您的更改...

关于apache-spark - 如何解决由于使用gradle或其他任何东西使用两个不同版本的同一个库而引起的NoMethodError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41003416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com