2013-10-25 107 views
0

我有一個scala項目,我已經使用sbt包構建並運行到目前爲止。現在我需要將它們移植到另一臺機器上。因此,我可以看到,JAR文件java.lang.NoClassDefFoundError:從Scala運行JAR時

$PROJECT_HOME/target/scala-2.9.3/My-app_2.9.3-1.0.jar 

下創建但是,當我嘗試使用運行它們,

java -jar target/scala-2.9.3/My-app_2.9.3-1.0.jar 

錯誤信息是這樣的,

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/SparkContext 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2451) 
    at java.lang.Class.getMethod0(Class.java:2694) 
    at java.lang.Class.getMethod(Class.java:1622) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkContext 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 

我得到java.lang.NoClassDefFoundError:org/apache/spark/SparkContext異常。我知道如果JAR找不到/加載類的定義,通常會發生NoClassDefFoundError。但在我的sbt我已包括類,

name := "My App" 

version := "1.0" 

scalaVersion := "2.9.3" 

libraryDependencies += "org.apache.spark" %% "spark-core" % "0.8.0-incubating" 

任何錯誤的原因指針將不勝感激?謝謝!

+1

http://javareferencegv.blogspot.com/2013/10/debugging-javalangnoclassdeffounderror.html –

回答

3

你必須要麼建立脂肪 jar包括所有的依賴項(在你的情況下spark)或手動添加火花工件到類路徑。在第一種情況下,您可能必須使用onejar或sbt-assembly插件來實現sbt。

+0

如何將spark添加到類路徑中? – Learner

+0

@學習者必須到'〜/ .ivy2/cache /'(它是存放所有解析工件的地方)並在子目錄中找到合適的jar(結構應該與工件描述相同,例如*〜/ .ivy2/cache/org/apache/spark/spark-core/*,jar將被命名爲0.8.0-incubating.jar。現在你必須使用[classpath argument](http://stackoverflow.com/questions/219585/ java-classpath)設置爲java調用 –

+4

您可能需要設置'retrieveManaged:= true',這將導致sbt將所有需要的jar複製到'lib_managed/jars'目錄中,我不得不在'〜/ .ivy2/cache /'中爲它們摸索。 –

相關問題