scala ide无法为lambda函数找到编译器生成的类

kuuvgm7e  于 2021-06-04  发布在  Kafka
关注(0)|答案(0)|浏览(253)

我使用以下程序为eclipse创建了基于maven的scala项目(scala ide):

package example

import org.apache.kafka.common.serialization.{ ByteArrayDeserializer, StringDeserializer }
import org.apache.kafka.clients.consumer.KafkaConsumer
import com.typesafe.config.ConfigFactory
import scala.collection.JavaConverters._

object BasicKafkaConsumer {
    def main(args : Array[String]) : Unit = {
        val conf = ConfigFactory.load

        println("bootstrap.servers: " + conf.getString("kafka.brokers"))
        println("bootstrap.topics: " + conf.getString("kafka.topics"))

        val kafkaParams = Map[String, Object](
            "bootstrap.servers" -> conf.getString("kafka.brokers"),
            "key.deserializer" -> classOf[ByteArrayDeserializer],
            "value.deserializer" -> classOf[ByteArrayDeserializer],
            "group.id" -> "example",
            "receive.buffer.bytes" -> (65536 : java.lang.Integer),
            // auto offset reset is unfortunately necessary with dynamic topic subscription
            "auto.offset.reset" -> "latest"
        ).asJava

        val topics = conf.getString("kafka.topics").split(",").toList.asJava

        val consumer = new KafkaConsumer[Array[Byte], Array[Byte]](kafkaParams)
        consumer.subscribe(topics)
        consumer.poll(0)
        println("Starting positions are: ")
        consumer.assignment.asScala.foreach { tp =>
            println(s"${tp.topic} ${tp.partition} ${consumer.position(tp)}")
        }

        while (true) {
            println(consumer.poll(512).asScala.map(_.value.size.toLong).fold(0L)(_ + _))
            Thread.sleep(1000)
        }
    }
}

当我在eclipse中运行它(文件basickafkaconsumer.scala->右键单击->运行方式->scala应用程序)时,会出现以下异常:

Starting positions are: 
Exception in thread "main" java.lang.NoClassDefFoundError: example/BasicKafkaConsumer$$anonfun$main$2
    at example.BasicKafkaConsumer$.main(BasicKafkaConsumer.scala:31)
    at example.BasicKafkaConsumer.main(BasicKafkaConsumer.scala)
Caused by: java.lang.ClassNotFoundException: example.BasicKafkaConsumer$$anonfun$main$2
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 2 more

i、 vm找不到从consumer.assignment.asscala.foreach{…}调用的lambda函数的类。
当我检查项目的目标目录时,我看到文件target/example/basickaffkaconsumer$$anonfun$main$2.class,我可以在java反编译器中打开它并验证它是否有合理的内容。
然而,无论出于什么原因,vm都无法加载它。
我看不到java命令行,因为scalaide在scala项目的运行/调试配置中不提供“show command line”。
我还创建了一个并行的更简单的程序

package example

import com.typesafe.config.ConfigFactory

object TestA {
    def main(args : Array[String]) : Unit = {
        // val conf = ConfigFactory.load

        val a = Array("apple", "banana", "orange")

        for (e <- a) println(e)

        a.foreach { e =>
            val s = e.toUpperCase
            println(s)
        }
    }
}

一开始,当“val conf”被取消注解时,调用for构造(对于“for”循环)也会遇到类似的错误,但当“val conf”被注解掉时就不会了。但后来我重新整理了一些电线,不管“val conf”是否被注解掉,testa现在都可以正常运行。但是basickafkaconsumer仍然无法找到lambda函数类。
为什么会发生这种情况?我该如何解决?
完整项目如下:https://github.com/so-public-so/kafkaplay 在“导入maven项目”之后,需要手动设置:
将性质投影到scala(项目->右键单击->配置->添加scala性质)
在项目->右键单击->属性->scala编译器中,将scala版本转换为“最新的2.11捆绑包(动态)”
在project->right click->properties->java build path->libraries中删除scala库容器(因为它作为依赖项包含在pom.xml中)
我的eclipse版本是:2019-12(4.14.0)build id:20191212-1212
scala ide是4.7.1.v-2匼12-201801021323-2dfe808
谢谢你的建议!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题