我即将开始重写我们的 Rails 应用程序的零碎部分,这些应用程序在 Scala 中执行相对较重的数字运算以提高速度。最终的计划是让所有的处理都由后台运行的 scala 守护进程完成,并且只使用 Rails 作为前端,但与此同时,我希望现在能够重写一些较慢的代码,并从同步调用它们红宝石。
出于这个原因,我一直在研究RJB(我不能使用 JRuby),希望我也可以将它与 scala 一起使用,因为它最终会编译为 Java 字节码。我有一个谷歌,看看我是否能找到已经做过这个或类似但没有想出任何东西的人。
我最初的、幼稚的尝试是将一个测试 scala 类编译并打包到一个 jar 中,然后尝试使用 Rjb 加载它,如下所示:
Rjb::load("#{Rails.root}/lib/scala/scala-tester-1.0-SNAPSHOT.jar")
MyClass = Rjb::import('com.mydomain.MyClass')
但这只会导致java.lang.NoClassDefFoundError: com/mydomain/MyClass
.
我测试了导入一个标准的 java 类,它工作正常,所以我测试了 importing scala.Int
,这导致了另一个NoClassDefFoundError
. 这种向我暗示问题可能在于类路径中未包含的 scala 库?但是自从我不得不处理 Java 类路径的无休止的头痛以来已经有一段时间了,所以我对诊断和修复这类问题相当生疏。
那么,有没有人这样做过?如果不是,我的预感听起来正确吗?有什么建议么?还是有什么我没有想到的,这意味着这种方法根本行不通?
编辑:意识到我一直在使用稍微不正确的语法。现在已经设法让它使用如下语法加载我的测试 jar:
Rjb::load(classpath = "#{Rails.root}/lib/scala/scala-tester-1.0-SNAPSHOT.jar", jvmargs=[])
但以不同的方式失败,java.lang.NoClassDefFoundError: scala/ScalaObject
这表明它肯定无法加载 scala 库。