/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 が機能します。すばらしいことに、すべての Web アプリケーションに scala-library.jar を追加する必要はありません。
しかし、非常に奇妙なことに、次の定義を呼び出そうとすると、エラーが発生します。
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 Modules のバグなのかわかりません。
問題は、誰かが解決策を教えてくれますか、それとも既知の問題ですか?