2012-02-28 68 views
2

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

由于这个原因,我一直在寻找RJB(我不能使用JRuby),希望我也可以在Scala中使用它,看到它最终编译为Java Bytecode。我有一个谷歌周围,看看我是否可以找到谁已经做了这个或类似的人,但没有拿出任何东西。

我inital,天真的尝试是刚刚编译和打包测试的Scala类,装入瓶内,并尝试使用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库没有包含在classpath中?但是,由于我不得不面对Java类路径的无穷头疼,所以我在诊断和修复这类问题时非常生疏。

那么,有没有人这样做?如果不是,我的预感是否正确?有什么建议么?或者有什么我没有想到的,这意味着这种方法根本无法工作?

编辑:意识到我一直在使用稍微不正确的语法。现在设法得到它使用的语法像这样我的加载试验瓶:

Rjb::load(classpath = "#{Rails.root}/lib/scala/scala-tester-1.0-SNAPSHOT.jar", jvmargs=[]) 

但不能用不同的java.lang.NoClassDefFoundError: scala/ScalaObject这表明这绝对是无法加载阶库。

回答

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) 

打算把这个代码在初始化,但它仍然似乎有点哈克,并很乐意听到的话,任何人有任何整洁建议。