2011-12-15 135 views
9

我有一個帶有RemoteActors的小應用程序,我想從中創建一個jar文件。當我試着執行它時它得到此異常:運行Scala jar文件時出現NoClassDefFoundError

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.lang.NoClassDefFoundError: scala/actors/Combinators 
    at pingpong.PingApp$.main(PingApp.scala:5) 
    at pingpong.PingApp.main(PingApp.scala) 
    at pingpong.ScalaEntryPoint.main(ScalaEntryPoint.java:5) 
    ... 5 more 
Caused by: java.lang.ClassNotFoundException: scala.actors.Combinators 
    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 java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    ... 8 more 

我已經在我的jar文件中包含Scala的-library.jar,並且它是在類路徑中。否則,java將停止發現類ScalaObject

+0

更多的運行時信息將是很好的。你想用Maven構建一個jar嗎?或者只是讓它與Eclipse一起運行? – hellectronic 2011-12-15 22:22:50

+1

至少,顯示您調用的命令行,並提及您正在使用的Scala版本。 – retronym 2011-12-16 06:48:45

回答

1

問題是Eclipse上的Scala插件和安裝的Scala版本之間的版本不匹配。演員/ Combinators.scala出現在2.8,Eclipse插件是2.8,但我包括2.7.7 scala-library.jar

4

Java不處理「jar中的jar」。默認的類加載器無法以這種方式加載類。

從你的堆棧跟蹤看來,你已經使用了eclipse的export-> java-> runnable jar。它應該包括一個特殊的類加載器,它在jar加載中處理jar,但它似乎不工作。

我猜測出現問題,構建jar或它被scala困惑,它們都包含在jar和classpath中。您可以使用「將庫解壓縮到jar」而不是「將庫解壓到jar」來重新嘗試。你可以在類路徑中沒有scala的情況下嘗試它。

失敗,還有其他選擇,如果你想要一個可交付的罐子:

  • 您可以打開所有你所依賴的罐子,並與您編譯的類重新包裝他們(應該是什麼「解壓」做以上)。 Maven的shade插件可以爲此提供幫助。

  • 您可以使用不同的解決方案,將提供一個類加載器實現,它可以加載嵌套的罐子,就像OneJar

希望這是有用的,如果你需要更多的幫助,你需要確切地描述哪些步驟採取產生這個罐子,並且可能輸出「jar tvf myjar.jar」也會有所幫助。

相關問題