java - 运行 Scala jar 文件时出现 NoClassDefFoundError

标签 java scala jar noclassdeffounderror remote-actors

我有一个带有 RemoteActor 的小应用程序,我想从中制作一个 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

最佳答案

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

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

我猜是构建 jar 时出了点问题,或者它被同时包含在 jar 和类路径中的 scala 弄糊涂了。您可以使用“将库提取到 jar”而不是“将库打包到 jar”再试一次。您可以在类路径上没有 scala 的情况下尝试它。

如果您想要一个可运输的 jar,则没有其他选择:

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

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

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

关于java - 运行 Scala jar 文件时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8526757/

相关文章:

java - 如何在 Delphi 中调试从 Java 调用的 DLL?

java - 在接口(interface)中使用 Java 泛型来强制实现以实现类型作为参数的方法

scala - Akka DistributedPubSubMediator at-least-once delivery guarantees for publishing to a topic

java - Intellij 模块在重建时被遗忘

java - 除以 2 右移运算符和传统除法运算符哪个更好?

java - 从具有属性的 jar 运行 java 应用程序

scala - 如何在不发送模式或使用注册表的情况下使用 Akka Persistence 发展 Avro 模式?

angularjs - Postman 对基于 REST 的 POST 方法给出错误

java - launch4j 中的 .exe 有效,但不适用于所有计算机

java - GenJar 替换或更新?