如何打包.jar java main + jruby编译类+ ruby​​脚本?

时间:2015-10-13 15:55:50

标签: java ruby scala jar jruby

我正在构建一个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(s​​cala) - &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群集上。 这有可能,怎么样?

我查看了warblerrawr。但是,我不知道这些工具如何在这个混合环境中帮助我(主要是Java,有些是编译ruby,有些是纯脚本)。

任何帮助表示赞赏!

1 个答案:

答案 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