【问题标题】:java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Objectjava.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object
【发布时间】:2016-06-30 15:07:51
【问题描述】:

我正在使用 flink 和 kafka,我收到了这个错误。

java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object;
    at kafka.consumer.FetchRequestAndResponseMetrics.<init>(FetchRequestAndResponseStats.scala:32)
    at kafka.consumer.FetchRequestAndResponseStats.<init>(FetchRequestAndResponseStats.scala:46)
    at kafka.consumer.FetchRequestAndResponseStatsRegistry$$anonfun$2.apply(FetchRequestAndResponseStats.scala:59)
    at kafka.consumer.FetchRequestAndResponseStatsRegistry$$anonfun$2.apply(FetchRequestAndResponseStats.scala:59)
    at kafka.utils.Pool.getAndMaybePut(Pool.scala:61)
    at kafka.consumer.FetchRequestAndResponseStatsRegistry$.getFetchRequestAndResponseStats(FetchRequestAndResponseStats.scala:63)
    at kafka.consumer.SimpleConsumer.<init>(SimpleConsumer.scala:39)
    at kafka.javaapi.consumer.SimpleConsumer.<init>(SimpleConsumer.scala:34)
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer.getPartitionsForTopic(FlinkKafkaConsumer.java:695)
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer.<init>(FlinkKafkaConsumer.java:281)
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer082.<init>(FlinkKafkaConsumer082.java:49)
    at com.inndata.flinkkafka.ReadFromKafka.main(ReadFromKafka.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:505)
    at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:403)
    at org.apache.flink.client.program.Client.runBlocking(Client.java:248)
    at org.apache.flink.client.CliFrontend.executeProgramBlocking(CliFrontend.java:866)
    at org.apache.flink.client.CliFrontend.run(CliFrontend.java:333)
    at org.apache.flink.client.CliFrontend.parseParameters(CliFrontend.java:1192)
    at org.apache.flink.client.CliFrontend.main(CliFrontend.java:1243)

我正在使用 flink - 1.0.3 版本和 Kafka- kafka_2.11-0.8.2.1 和 scala - 2.11.5,这些是我在构建路径中使用的 jar:

asm-4.0.jar,commons-codec-1.6.jar,commons-exec-1.1.jar,commons-fileupload-1.2.1.jar,commons-io-2.4.jar,commons-lang-2.5.jar,commons-logging-1.1.3.jar,commons-logging-api-1.1.jar,curator-test-3.2.0.jar,disruptor-2.10.1.jar,flink-annotations-1.0.3.jar,flink-clients_2.10-1.0.3.jar,flink-clients_2.10-1.0.3-tests.jar,flink-core-1.0.3.jar,flink-dist_2.10-1.0.3.jar,flink-java-1.0.3.jar,flink-optimizer_2.10-1.0.3.jar,flink-python_2.10-1.0.3.jar,flink-runtime_2.10-1.0.3.jar,flink-test-utils_2.10-1.0.3.jar,guava-11.0.2.jar,hadoop-client-2.6.0.jar,hadoop-mapreduce-client-core-2.6.0.jar,hamcrest-all-1.3.jar,jetty-6.1.26.jar,jetty-util-6.1.26.jar,json-simple-1.1.1.jar,junit-4.11.jar,log4j-1.2.17.jar,logback-classic-1.0.13.jar,logback-core-1.0.13.jar,slf4j-api-1.7.7.jar,slf4j-log4j12-1.7.7.jar,zkclient-0.3.jar,zookeeper-3.4.6.jar,flink-connector-kafka-0.10.2.jar,flink-streaming-java-0.10.2.jar,kafka-clients-0.8.2.1.jar,kafka_2.11-0.8.2.1-test.jar,kafka_2.11-0.8.2.1-sources.jar,kafka_2.11-0.8.2.1-scaladoc.jar,kafka_2.11-0.8.2.1-javadoc.jar,kafka_2.11-0.8.2.1.jar,scala-xml_2.11-1.0.2.jar,scala-parser-combinators_2.11-1.0.2.jar,scala-library-2.11.5.jar,metrics-core-2.2.0.jar

我试图搜索这个问题,但我找不到相关的jar。请帮我解决这个问题。

【问题讨论】:

  • 大多数 NoSuchMethodErrors 是由于在开发/编译时您使用了一个版本的 jar 和运行时您使用的是另一个版本的 jar(其中不包含具有精确语法的方法你正在寻找)。在编译时和运行时检查 jar 版本。
  • classpath中有_2.10_2.11的scala库,不兼容
  • @kosa 我该如何检查?

标签: java scala apache-flink flink-streaming


【解决方案1】:

有几个罐子可能是问题的原因。 scala-library-2.11.5.jar 建议您使用 Scala 2.11,这似乎与 kafka_2.11-0.8.2.1.jar 一致。

但是,在你的 CP 中,我还看到了 flink-clients_2.10-1.0.3.jarflink-runtime_2.10-1.0.3.jar 等。这些是针对 Scala 2.10 编译的 Scala 库。那就是问题所在。

Scala 中的二进制文件在主要版本之间不兼容。这些jar如果存在的话,你需要找到2.11版本或者自己编译成2.11。

【讨论】:

    【解决方案2】:
    1. 导航到项目文件夹下的 Scala 文件夹,例如src -&gt; test -&gt; scala

    2. 右键单击Scala目录并选择将目录标记为Test Sources Root

    3. 现在将src 目录标记为Sources Root

    【讨论】:

      【解决方案3】:

      在尝试使用 Runner 类触发模拟时,我的代码库中也遇到了同样的问题,但是当使用下面的 maven 命令触发时,这看起来很好,

      mvn gatling:test -Dgatling.simulationClass=simulations.simulationClassName
      

      这只是因为版本不匹配

      在使用 Runner 类运行它之前要检查的事情(为我工作)

      1. 检查 java 是否配置正确并反映版本 (在我的情况下为 1.8.0_251)
      2. 检查maven是否设置正确(3.6.3指向同一个java 版本同上)
      3. 如果您使用 IntelliJ,请确保您已在全局中添加了 scala SDK 库(在我的情况下为 2.12.8)
      4. 完成所有配置后,重新构建您的项目
      5. 现在使用 Runner 触发您的模拟,应该可以工作。

      【讨论】: