使用RJB从Ruby调用scala代码

时间:2012-02-28 11:27:42

标签: ruby scala rjb

我即将开始重写我们的Rails应用程序中的一些部分,这些应用程序在Scala中执行相对较重的数字运算以提高速度。该计划最终将由在后台运行的scala守护程序完成所有处理,并且只使用Rails作为前端,但同时我希望能够重写现在较慢代码的一些部分并同步调用它们红宝石。

出于这个原因,我一直在寻找RJB(我不能使用JRuby),希望我也可以将它与scala一起使用,因为它最终会编译成Java Bytecode。我有一个谷歌,看看我是否能找到一个已经做过这个或类似但没有想出任何东西的人。

我的初衷,天真的尝试是将一个测试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类,它运行正常,所以我测试了导入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库。

1 个答案:

答案 0 :(得分: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)

要将此代码放在初始化程序中,但它仍然看起来有点hacky并且很高兴听到是否有人有任何更整洁的建议。