Java joda DateTimeFormat的NoClassDefFoundError
我试图在Spark项目(Scala)中使用joda的DateTimeFormat,我使用sbt作为构建工具,当我尝试将其作为独立应用程序运行时,它会给我一个java.lang.NoClassDefFoundError。这对我来说似乎很奇怪,因为当我在控制台中使用它时,我没有收到任何错误,但是当我尝试将它作为应用程序运行时,它会出错Java joda DateTimeFormat的NoClassDefFoundError,java,scala,sbt,jodatime,apache-spark,Java,Scala,Sbt,Jodatime,Apache Spark,我试图在Spark项目(Scala)中使用joda的DateTimeFormat,我使用sbt作为构建工具,当我尝试将其作为独立应用程序运行时,它会给我一个java.lang.NoClassDefFoundError。这对我来说似乎很奇怪,因为当我在控制台中使用它时,我没有收到任何错误,但是当我尝试将它作为应用程序运行时,它会出错 Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/format/Dat
Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/format/DateTimeFormat
at com.bdcoe.poc.spark.analytics.Driver$.main(Driver.scala:35)
at com.bdcoe.poc.spark.analytics.Driver.main(Driver.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:292)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.joda.time.format.DateTimeFormat
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 9 more
这是我的build.sbt文件,它位于项目的根目录中:
import AssemblyKeys._
import net.virtualvoid.sbt.graph.Plugin.graphSettings
organization := "com.bdcoe.poc"
name := "spark-analytics"
scalaVersion := "2.10.4"
resolvers ++= Seq(
"Local Maven" at Path.userHome.asFile.toURI.toURL + ".m2/repository"
)
libraryDependencies ++= {
val slf4jVersion = "1.7.7"
Seq(
"org.apache.spark" %% "spark-core" % "1.0.0",
"com.github.nscala-time" %% "nscala-time" % "1.2.0",
"org.scalatest" %% "scalatest" % "2.0" % "test",
"org.slf4j" % "slf4j-api" % slf4jVersion % "provided",
"org.slf4j" % "slf4j-nop" % slf4jVersion % "test",
"joda-time" % "joda-time" % "2.2",
"org.joda" % "joda-convert" % "1.2"
)
}
以下是我对joda的导入/使用:
import org.joda.time.format.DateTimeFormat.{ forPattern => formatFor }
val dateTime = formatFor("YYYY-MM-dd HH:mm").parseDateTime _
val timeStamp: DateTime = dateTime(args(2))
关于为什么它可以在sbt控制台中找到joda而不是作为独立应用程序运行时找到joda,有什么建议吗?问题在于运行时的类路径 我注意到您正在使用
sbt汇编
。在导入到build.sbt
后添加此assemblySettings
行:
import AssemblyKeys._
import net.virtualvoid.sbt.graph.Plugin.graphSettings
assemblySettings
organization := "com.bdcoe.poc"
...
如文档中所述:。Sbt程序集将找到主类并用正确配置的清单打包JAR
请注意,您应该运行的任务是
assembly
,而不是package
。如果项目中不包含assemblySettings
,您以前将无法运行此任务,并且由于您正在运行打包的JAR(很可能),因此您必须使用package
任务生成它,而不是使用assembly
运行时,您需要将包含org.joda类的JAR文件安排在类路径中。控制台已经为您完成了这项工作,它会找到类并运行所有内容。您的问题是,在命令行上运行时,系统找不到包含类的JAR,并且无法加载该类。如何打包?您使用什么SBT命令或插件来打包它?您是否直接运行类而不是jar?你能提供一个cmd来运行它吗?使用Java8版本。java 7没有包含此库