2

我即将开始重写我们的 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 库。

4

1 回答 1

2

我得到它与以下工作:

RJB_LOAD_PATH = ["#{ENV['SCALA_HOME']}/lib/scala-library.jar", "#{Rails.root}/lib/scala/scala-tester-1.0-SNAPSHOT.jar"].join(File::PATH_SEPARATOR)
RJB_OPTIONS = []

Rjb::load(RJB_LOAD_PATH, RJB_OPTIONS)

要将这段代码放在初始化程序中,但它仍然看起来有点笨拙,如果有人有任何更简洁的建议,我会很高兴。

于 2012-02-28T12:42:40.040 回答