我正在构建一个Spark应用程序,它利用了Ruby中已经开发的一些功能。
我通过在ruby中定义std::vector<int>
类并使用JRuby进行编译,选择从Scala main调用Ruby部分。
然后我可以使用MyProxy
来调用保留在脚本中的其余Ruby代码。最重要的原因是我无法用JRuby编译它们,可能是因为它们太动态了:
MyProxy
和Scala Main:
## myProxy.rb -> compiled into myProxy.class
## jrubyc --javac myProxy.rb
require 'java'
java_package 'ruby.proxy'
require_relative 'some.rb'
class MyProxy
def self.invoke_script()
... ## invoke some other ruby in script that are note compiled by jrubyc
end
end
在运行时,流程就像这样:
Main.class(scala) - &gt;调用myProxy.class(myProxy.rb编译的ruby) - &gt;在script.rb中调用函数
它有效,我能够为Scala创建一个可运行的jar并编译ruby部分。但是当我运行它时:object myRun extends App {
val something = MyProxy.invoke_script()
...
}
,
它仍然需要访问我的myProxy.rb文件,当然还有所有其他scrips.rb。
因此,在执行此命令时,我需要工作目录中所有ruby脚本的副本。
理想情况下,我想在myApp.jar中包含所有ruby脚本,并且能够轻松部署在spark群集上。 这有可能,怎么样?
我查看了warbler和rawr。但是,我不知道这些工具如何在这个混合环境中帮助我(主要是Java,有些是编译ruby,有些是纯脚本)。
任何帮助表示赞赏!
答案 0 :(得分:0)
正如jruby documentation中所述,在jar中包装ruby脚本应该很简单,因为它们包含在.jar中(原文如此):
Java类路径中的所有内容都被视为加载路径条目,因此,例如,JAR文件中包含的.rb脚本是可加载的。
我的情况不适用,因为我在我的脚本which doesn't seem to work properly in recent release of JRuby中使用了 require_relative 。用 require 替换 require_relative 使其适用于 myApp.jar 中嵌入的脚本。
此外,在 titi.rb 中使用require_relative 'toto'
触发了 titi.rb 脚本未找到的错误,这是错误的,因为它是 titi正在执行的.rb 。