执行Scala Jar包时遇NoClassDefFoundError: scala/Product$class问题求助
问题:执行Scala Jar包时抛出
NoClassDefFoundError: scala/Product$class 执行Scala代码打包的Jar包时,遇到错误:
NoClassDefFoundError: scala/Product$class
其根源为ClassNotFoundException: scala.Product$class
环境版本信息
- Scala 2.12
- SBT 1.7.1
- Spark 3.1.2
- JDK 1.8.0_331
项目sbt.build依赖配置
"org.apache.spark" %% "spark-core" % "3.1.2" %"provided", "org.apache.spark" %% "spark-sql" % "3.1.2" %"provided", "commons-validator" % "commons-validator" % "1.6", "org.elasticsearch" %% "elasticsearch-spark-20" % "7.14.1", "com.github.pureconfig" %% "pureconfig" % "0.12.3", "org.rogach" %% "scallop" % "3.5.0", "com.github.dwickern" %% "scala-nameof" % "1.0.3" , "com.sksamuel.elastic4s" %% "elastic4s-core" % "7.14.1", "com.sksamuel.elastic4s" %% "elastic4s-client-esjava" % "7.14.1", "com.sksamuel.elastic4s" %% "elastic4s-http-streams" % "7.14.1", "com.sksamuel.elastic4s" %% "elastic4s-testkit" % "7.14.1" % "test", "com.databricks" % "dbutils-api_2.11" % "0.0.4"
解决方案
1. 修复跨Scala版本依赖冲突
注意到com.databricks" % "dbutils-api_2.11" % "0.0.4"是基于Scala 2.11编译的,与项目使用的Scala 2.12版本不兼容,这会导致类加载时出现scala.Product$class找不到的问题。将该依赖替换为匹配Scala 2.12的版本:
"com.databricks" %% "dbutils-api" % "0.0.4"
使用%%会自动匹配项目的Scala版本,确保依赖是对应2.12的编译版本。
2. 调整打包合并策略(若使用sbt assembly)
如果用sbt assembly打包,需配置assembly插件处理重复类的合并,避免Scala核心类冲突:
assemblyMergeStrategy in assembly := { case PathList("scala", "Product$class") => MergeStrategy.first case x => val oldStrategy = (assemblyMergeStrategy in assembly).value oldStrategy(x) }
3. 确认运行时ClassPath包含Scala核心库
- 若通过Spark集群运行:确保集群环境使用的Scala版本与项目一致(Spark 3.1.2默认适配Scala 2.12,无需额外配置)。
- 若本地单独运行Jar包:需将Scala 2.12的核心库加入运行命令的ClassPath,例如:
java -cp "your-jar.jar:/path/to/scala-library-2.12.x.jar" your.main.Class
4. 清理重构项目
执行以下命令清理旧构建文件,重新编译打包:
sbt clean sbt compile sbt assembly # 或你使用的其他打包命令
内容的提问来源于stack exchange,提问作者Pankajkumar Shende
相关产品推荐
相关产品推荐

