运行Scala Jar

时间:2013-05-14 10:59:02

标签: eclipse scala jar noclassdeffounderror

当我使用Eclipse将我的scala代码打包到jar中时,我无法运行所述jar文件。我有:

    object Hello extends App{
       println("Hello World!")
    }

    public class Runner {
       public static void main(String[] args) {
          Hello.main(args);
       }
   }

我使用eclipse将其打包成一个名为Hello.jar的可运行jar。 java -jar Hello.jar然后给出:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/App
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at Hello.main(Hello.scala)
at Runner.main(Runner.java:4)
Caused by: java.lang.ClassNotFoundException: scala.App
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 13 more

2 个答案:

答案 0 :(得分:3)

您的应用程序依赖于Scala运行时库。这些应用程序在运行时需要可用,而且目前它们不是。

有两种方法可以解决这个问题:

  1. 启动JAR时指定类路径 - 方便一次性,但很笨重。从命令行运行java -jar /path/to/yourapp.jar,并添加一个-cp参数,其中包含Scala库JAR的路径。
  2. 将Scala库JAR打包在您自己的JAR中,并修改Manifest以引用此JAR(通过添加Class-Path属性 - see here)。这需要在构建过程中进行更多工作,但这意味着只需双击生成的JAR即可启动应用程序。

答案 1 :(得分:1)

那是因为eclipse没有使用您的代码发送scala-library。更重要的是,您应该确保所有依赖项都在可执行jar的清单文件中。这是stackoverflow中的一个类似问题: running scala apps with java -jar