【问题标题】:ClassNotFoundException on Marshal.loadMarshal.load 上的 ClassNotFoundException
【发布时间】:2011-04-24 01:36:54
【问题描述】:

我正在尝试在 Scala 中进行编组转储和加载...

import scala.util.Marshal

case class Test(test: String)

val t = Test("hello")
val bytes = Marshal.dump(t)
Marshal.load[Test](bytes)

...但是对 Marshal.load 的调用抛出 ClassNotFoundException...

java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:603)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
at java.io.ObjectInputStream.readClass(ObjectInputStream.java:1461)
at java.io.Ob...

我也尝试过使用完全限定的类名,但没有成功。我错过了什么?

【问题讨论】:

  • 您的代码在 Scala 2.8.1 中运行良好。
  • @Frank 它不适合我——在 Windows 上。也许由于某种原因它在 Windows 上不起作用?如果是这样,一张票可能就可以了。
  • @Daniel 我在 Linux 上测试过。
  • 我也在Linux下测试过代码。当我通过 scalac 编译代码并使用 scala 运行它时它可以工作,但是当我将代码直接放入解释器时它不起作用。你使用解释器进行测试了吗,scttnlsn?
  • 即使我将代码复制并粘贴到 REPL 中,它也能按预期工作。

标签: serialization scala marshalling unmarshalling classnotfoundexception


【解决方案1】:

您使用的是哪个版本的 SBT?我在使用 SBT 0.7.7 时遇到了类似的问题,并通过在我的构建中添加以下内容来解决它们:

// cause the SBT "run" action to fork                                                                                                              
override def fork = Some(new ForkScalaRun() {
  override def scalaJars = Seq(buildLibraryJar.asFile, buildCompilerJar.asFile)
})

导致 fork 的“运行”操作似乎可以解决类加载器问题,以及捕获 System.exit 调用的问题:

http://code.google.com/p/simple-build-tool/wiki/Forking

http://code.google.com/p/simple-build-tool/wiki/RunningProjectCode

【讨论】:

  • 对于较新版本的 sbt,请在您的 build.sbt 中使用 fork in run := true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2023-03-21
  • 2014-11-25
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多