2014-07-07 59 views
2

我想在我使用sbt作爲構建工具的Spark項目(斯卡拉)中使用joda的DateTimeFormat,並且當我嘗試運行它時給它一個java.lang.NoClassDefFoundError作爲獨立的應用程序。這似乎很奇怪我,因爲我沒有得到任何錯誤,當我在控制檯玩它,但是當我嘗試使用NoClassDefFoundError for joda DateTimeFormat

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" 
) 
} 

這裏是喬達我的導入/用法:

import org.joda.time.format.DateTimeFormat.{ forPattern => formatFor } 

val dateTime = formatFor("YYYY-MM-dd HH:mm").parseDateTime _ 
val timeStamp: DateTime = dateTime(args(2)) 

爲什麼它可以在SBT控制檯找喬達任何建議,但不運行時作爲一個stan達隆應用程序?

+0

你如何打包?你用什麼SBT命令或插件來打包它?你是直接運行這個類而不是一個jar嗎?你能提供一個你用來運行它的cmd嗎? –

+0

使用java 8版本。 java 7沒有包含這個庫 – Nilesh

回答

1

問題出在運行時的類路徑。

我注意到你正在使用sbt-assembly。如在文檔中描述的

import AssemblyKeys._ 
import net.virtualvoid.sbt.graph.Plugin.graphSettings 

assemblySettings 

organization := "com.bdcoe.poc" 

... 

:添加進口此後assemblySettings線在你build.sbthttps://github.com/sbt/sbt-assembly。 Sbt-assembly將找到主類並使用正確配置的清單打包JAR。

請注意,您應該運行的任務是assembly,而不是package。如果沒有assemblySettings包含在您的項目中,您以前將無法運行此任務,而且由於您正在運行打包的JAR(很可能),因此您必須使用package任務生成它,而不是assembly

0

您需要安排包含org.joda類的JAR文件在運行時位於CLASSPATH中。控制檯已經爲你做了這個,它發現類和一切運行。你的問題是,當在命令行上運行時,系統沒有找到帶有該類的JAR,並且無法加載該類。

相關問題