我使用以下程序为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
谢谢你的建议!
暂无答案!
目前还没有任何答案,快来回答吧!