什么会导致java.lang.ClassNotFoundException:[B?

时间:2013-07-16 00:28:30

标签: java scala akka

我正在使用Akka 2.2.0,Java 1.7.0_25和Eclipse Juno重写客户端/服务器应用程序。

我有一个示例客户端和服务器使用Akka 2.0.2 我更新到旧的稳定版本2.1.4并再次使一切工作。 我刚刚转到最新的稳定版本2.2.0。

我创建了一个新包来添加一些新功能,保持现有代码不变。 有些东西改变了,现在我无法启动我的测试用例。

这是我在尝试创建ActorSystem时看到的堆栈跟踪:

Exception in thread "main" java.lang.ClassNotFoundException: [B
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at akka.actor.ReflectiveDynamicAccess.getClassFor(DynamicAccess.scala:94)
at akka.serialization.Serialization$$anonfun$4.apply(Serialization.scala:154)
at akka.serialization.Serialization$$anonfun$4.apply(Serialization.scala:153)
at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:697)
at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:178)
at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:347)
at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:696)
at akka.serialization.Serialization.<init>(Serialization.scala:153)
at akka.serialization.SerializationExtension$.createExtension(SerializationExtension.scala:15)
at akka.serialization.SerializationExtension$.createExtension(SerializationExtension.scala:12)
at akka.actor.ActorSystemImpl.registerExtension(ActorSystem.scala:644)
at akka.actor.ExtensionId$class.apply(Extension.scala:34)
at akka.serialization.SerializationExtension$.apply(SerializationExtension.scala:12)
at akka.remote.RemoteActorRefProvider.init(RemoteActorRefProvider.scala:77)
at akka.actor.ActorSystemImpl._start(ActorSystem.scala:568)
at akka.actor.ActorSystemImpl.start(ActorSystem.scala:575)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:103)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:98)
at akka.actor.ActorSystem$.create(ActorSystem.scala:64)
at akka.actor.ActorSystem.create(ActorSystem.scala)

它抱怨它不能通过方法描述符样式字符串“[B”来加载字节数组。

@som-snytt指出了两个错误报告,它准确描述了我所看到的错误。

@ paul-vargas调出-Dsun.lang.ClassLoader.allowArraySyntax = true,重新启用旧的loadClass行为。

allowArraySyntax标志确实会使ClassNotFoundException消失,但会弹出其他错误。这些错误让我相信我的Eclipse / m2e / Scala-ide / Akka设置出了问题。

我将项目导入Netbeans 7.3并进行了清理和构建,并在第一次尝试时工作。我甚至不需要设置allowArraySyntax。

3 个答案:

答案 0 :(得分:4)

您可能需要将参数添加到VM:

-Dsun.lang.ClassLoader.allowArraySyntax=true

答案 1 :(得分:2)

这对所有人来说都不是新闻:

http://bugs.sun.com/view_bug.do?bug_id=6500212

http://bugs.sun.com/view_bug.do?bug_id=6434149

由于@ paul-vargas,我只看了那个。

我发现,在主干中,ReflectiveDynamicAccess使用Class.forName,因为建议使用错误报告。请参阅the code on master

您可能希望将您的Akka与Java版本一起升级。

或许,您的生产运行时可能会停留在1.5上,但您的开发时间为1.7。

答案 2 :(得分:0)

旧的akka​​和scala jars与更新版本一起在classpath上。不确定为什么它会导致上述异常,但一旦Paul指出allowArraySyntax标志,问题就变得明显了。