运行Scala jar文件时出现NoClassDefFoundError

时间:2011-12-15 21:20:16

标签: java scala jar noclassdeffounderror remote-actors

我有一个使用RemoteActors的小应用程序,我想从中创建一个jar文件。当我尝试执行它时会遇到这个异常:

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

2 个答案:

答案 0 :(得分:5)

Java不处理“jar中的jar”。默认的类加载器不能以这种方式加载类。

从你的堆栈跟踪中,看起来你已经使用了eclipse的export-> java-> runnable jar。它应该包含一个特殊的类加载器,它在jar加载中处理jar但似乎没有工作。

我猜想构建jar会出现问题,或者scala被包含在jar和classpath中时会感到困惑。您可以使用“将库提取到jar”而不是“将库打包到jar”中再次尝试此操作。您可以在类路径上没有scala的情况下尝试它。

如果您想要一个可发货的罐子,那么还有其他选择:

  • 您可以解压缩您所依赖的所有jar并使用已编译的类重新打包它们(应该是上面的“extract”)。 Maven的shade插件可以帮助解决这个问题。

  • 您可以使用另一种解决方案,该解决方案将提供可加载嵌套jar的类加载器实现,例如OneJar

希望这很有用,如果你需要更多的帮助,你需要准确描述你制作这个jar的步骤,可能“jar tvf myjar.jar”的输出也会有所帮助。

答案 1 :(得分:1)

问题是Eclipse上的Scala插件与已安装的Scala版本之间的版本不匹配。 actors / Combinators.scala出现在2.8中,Eclipse插件是2.8但是我包含了2.7.7 scala-library.jar