1

当我使用 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
4

2 回答 2

5

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

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

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

那是因为 Eclipse 不会随您的代码一起发布 scala-library。更重要的是,您应该确保所有依赖项都在可执行 jar 的清单文件中。这是来自stackoverflow的一个类似问题: running scala apps with java -jar

于 2013-05-14T11:28:24.930 回答