10

我有一个带有 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

4

2 回答 2

5

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

从您的堆栈跟踪来看,您似乎使用了 eclipse 的 export->java->runnable jar。它应该包括一个特殊的类加载器,它处理 jar 加载中的 jar,但它似乎不起作用。

我猜想构建 jar 时出了点问题,或者因为 scala 被包含在你的 jar 和你的类路径中而感到困惑。您可以使用“将库提取到 jar”而不是“将库打包到 jar”再试一次。您可以在类路径上不使用 scala 进行尝试。

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

  • 您可以解压缩您依赖的所有 jar,然后将它们与您编译的类一起重新打包(应该是上面的“提取”所做的)。Maven 的阴影插件可以帮助解决这个问题。

  • 您可以使用不同的解决方案来提供可以加载嵌套 jar 的类加载器实现,例如OneJar

希望这很有用,如果您需要更多帮助,您需要准确描述生成此 jar 所采取的步骤,并且“jar tvf myjar.jar”的输出可能也会有所帮助。

于 2011-12-16T20:25:01.147 回答
1

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

于 2011-12-22T12:37:02.930 回答