2013-05-14 97 views
1

當我使用Eclipse將我的scala代碼打包到jar中時,我無法運行所述jar文件。我有:運行Scala 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 

回答

1

這是因爲eclipse不會將scala-library與您的代碼一起發送。更重要的是,您應該確保所有依賴項都在可執行jar的清單文件中。這裏是一個類似的問題stackoverflow: running scala apps with java -jar

3

你的應用程序依賴於Scala運行時庫。這些需要在應用程序運行時可用,而目前它們不是。

有兩種方法來解決這個問題:

  1. 指定的類路徑,當你啓動JAR - 方便,一次性的,但笨重。從命令行運行java -jar /path/to/yourapp.jar,並添加一個-cp參數,其中包含Scala庫JAR的路徑。
  2. 在您自己的JAR中打包Scala庫JAR,並修改Manifest以引用此JAR(通過添加Class-Path屬性 - see here)。這需要您的構建過程有更多的工作,但這意味着只需雙擊生成的JAR即可啓動該應用程序。