我即将开始重写 Rails 应用程序的一些部分,这些应用程序在 Scala 中进行相对较繁重的数字运算以提高速度。最终的计划是让在后台运行的 scala 守护进程完成所有处理,并仅使用 Rails 作为前端,但与此同时,我希望能够现在重写一些较慢的代码,并从 ruby 。
出于这个原因,我一直在查看 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类,它工作得很好,所以我测试了导入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 库。
最佳答案
我让它可以与以下内容一起使用:
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)
打算将此代码放入初始化程序中,但它看起来仍然有点老套,并且很高兴听到是否有人有任何更简洁的建议。
关于ruby - 使用 RJB 从 Ruby 调用 scala 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9481051/