我有一个使用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
。
答案 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