我通过创建文件夹 /modules/org/scala/main 为 Scala 创建了一个 JBoss 模块(JBoss 7.1.1.Final),将 Scala 2.9.2 的 scala-library.jar 和 module.xml 一起放入其中:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.scala">
<resources>
<resource-root path="scala-library.jar"/>
</resources>
</module>
然后在我的 webapp 中,我添加了 /WebContent/WEB-INF/jboss-deployment-structure.xml:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.scala" />
</dependencies>
</deployment>
</jboss-deployment-structure>
几乎所有的 Scala 都可以工作——而且好处是我不必将 scala-library.jar 添加到每个 web 应用程序中。
但是,非常奇怪的是,当我尝试调用以下 def 时,出现错误:
def reserveOffer(event: EventOffer, tarifs: Seq[Tarif]) = {
val reservations = tarifs.par.map{ t =>
getAdapter(t.bookingSystem) match {
case Some(a) => a.reserveOffer(event, t)
case _ => throw new
IllegalStateException(
"Unknown adapter " +
t.bookingSystem)
}
}
reservations.seq
}
错误是:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class scala.collection.parallel.package$
at scala.collection.parallel.Combiner$class.$init$(Combiner.scala:37) [scala-library.jar:]
at scala.collection.parallel.mutable.ResizableParArrayCombiner$$anon$1.<init>(ResizableParArrayCombiner.scala:96) [scala-library.jar:]
at scala.collection.parallel.mutable.ResizableParArrayCombiner$.apply(ResizableParArrayCombiner.scala:96) [scala-library.jar:]
at scala.collection.parallel.mutable.ResizableParArrayCombiner$.apply(ResizableParArrayCombiner.scala:98) [scala-library.jar:]
at scala.collection.parallel.mutable.ParSeq$.newCombiner(ParSeq.scala:58) [scala-library.jar:]
at scala.collection.mutable.SeqLike$class.parCombiner(SeqLike.scala:27) [scala-library.jar:]
at scala.collection.mutable.ListBuffer.parCombiner(ListBuffer.scala:44) [scala-library.jar:]
at scala.collection.Parallelizable$class.par(Parallelizable.scala:40) [scala-library.jar:]
at scala.collection.mutable.ListBuffer.par(ListBuffer.scala:44) [scala-library.jar:]
at ch.maxant.scalabook.services.EventService.reserveOffer(EventService.scala:190) [classes:]
EventService 的第 190 行是:
val reservations = tarifs.par.map{ t =>
即创建并行序列的方法调用导致异常。
如果我不使用 JBoss 模块,并且将 scala-library.jar 粘贴到 WEB-INF/lib 中,那么我就没有这个问题。
我怀疑它与模块中的类加载有关,但我不知道在哪里修复它,或者它是否是 JBoss 模块中的错误?
问题是:谁能给我任何解决方案,或者这是一个已知问题?