在Eclipse中运行Spark应用报java.lang.NoClassDefFoundError的原因
嘿,这个异常我之前帮不少开发者排查过,核心问题其实很明确——Spark版本和Scala版本不兼容,或者你的项目里压根没装对版本的Scala依赖包。
具体为啥会出这问题?
Spark 1.4.1是基于Scala 2.10.x开发的,而你看到的scala.collection.GenTraversableOnce$class这个类,在Scala 2.11及以后的版本里被重构了,位置变了。如果你的项目里引的是Scala 2.11+的包,或者干脆没引Scala依赖,JVM找不到这个类,就会抛出这个错误。
对了,你用的JRE 1.8没问题,Spark 1.4.1是支持JDK 1.8的,别把锅甩给Java版本哈。
怎么解决?
第一步:引入对应版本的Scala依赖
Spark 1.4.1要配Scala 2.10.x(推荐2.10.6,是当时的稳定配套版本)。如果是Maven项目,把这段加到pom.xml里:<dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.10.6</version> </dependency>Gradle项目的话,加这个:
compile group: 'org.scala-lang', name: 'scala-library', version: '2.10.6'第二步:清理并重构Eclipse项目
右键项目 → 选Maven(或Gradle)→Clean,然后点Update Project,让Eclipse重新下载并导入正确的依赖包,避免旧依赖残留。第三步:检查Build Path
打开项目属性 →Java Build Path→Libraries,看看有没有混进其他版本的Scala库,只留Scala 2.10.x的版本就行,多余的删掉。
小提醒:Spark每个版本都绑定特定的Scala版本,比如Spark 1.x配2.10,Spark 2.x早期配2.11、后期支持2.12,Spark 3.x主要配2.12及以上。以后用Spark一定要严格对应版本,不然这类兼容性坑还会找上门~
内容的提问来源于stack exchange,提问作者pooja

