Java joda DateTimeFormat的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

我试图在Spark项目(Scala)中使用joda的DateTimeFormat,我使用sbt作为构建工具,当我尝试将其作为独立应用程序运行时,它会给我一个java.lang.NoClassDefFoundError。这对我来说似乎很奇怪,因为当我在控制台中使用它时,我没有收到任何错误,但是当我尝试将它作为应用程序运行时,它会出错

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没有包含此库