2013-07-16 61 views
3

我正在使用Akka 2.2.0,Java 1.7.0_25和Eclipse Juno重写客户端/服务器应用程序。什么会导致java.lang.ClassNotFoundException:[B?

我有一个示例客户端和服务器与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。

+1

你可以分享你正在使用的Akka和Java的版本吗? –

回答

2

这会不会是新闻给大家:

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

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

我只能看着,最多因@保罗 - 巴尔加斯。

我注意到,在trunk中,ReflectiveDynamicAccess使用Class.forName,因为建议使用bug报告。见the code on master

可能,您需要将您的Akka与Java版本一起升级。或者,您的生产运行时间可能会停留在1.5但您在1.7上进行开发。

+0

这些错误报告看起来完全正确。我仍然不确定为什么突然出现。 – Ryan

4

愿你所需要的参数添加到VM:

-Dsun.lang.ClassLoader.allowArraySyntax=true 
+0

这解决了我所看到的错误。但我为什么开始出现仍然处于亏损状态。我以前没有设置这个标志,代码正在工作。设置此标志后,我现在是一个NoSuchMethodError,它表明正在运行的代码正在查找旧的依赖关系。 – Ryan

0

旧的akka​​和斯卡拉瓶子与更新后的版本一起在classpath中。不知道为什么它会导致上述异常,但一旦Paul指出allowArraySyntax标志,问题就会变得明显。