2013-10-25 86 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 /'中为它们摸索。 –

相关问题