【问题标题】:How to package in a .jar java main + jruby compiled class + ruby script?如何打包在 .jar java main + jruby 编译类 + ruby​​ 脚本中?
【发布时间】:2016-01-11 11:25:36
【问题描述】:

我正在构建一个 Spark 应用程序,该应用程序利用了 Ruby 中已经开发的一些功能。

我选择通过在 ruby​​ 中定义 MyProxy 类并使用 JRuby 编译来从我的 Scala main 调用 Ruby 部分。 然后我可以使用MyProxy 来调用保留在脚本中的其余Ruby 代码。最重要的原因是我无法用 JRuby 编译它们,可能是因为它们太动态了:

## 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

还有 Scala Main:

object myRun extends App {
  val something = MyProxy.invoke_script()
  ...
}

在运行时流程如下所示:

Main.class (scala) -> 调用 myProxy.class(myProxy.rb 的编译 ruby​​) -> 在 script.rb 中调用函数

它有效,我能够为 Scala 和编译的 ruby​​ 部分制作一个可运行的 jar。但是当我运行它时:java -jar myApp.jar, 它仍然需要访问我的 myProxy.rb 文件,当然还有所有其他的 scrips.rb。 因此,执行此命令时,我需要工作目录中所有 ruby​​ 脚本的副本。

理想情况下,我还想在 myApp.jar 中包含所有 ruby​​ 脚本,并且能够轻松部署到 spark 集群上。 这可能吗?如何实现?

我看过warblerrawr。但是,我看不出这些工具如何在这种混合环境中帮助我(主要是 Java,部分是编译的 ruby​​,部分是纯脚本)。

任何帮助表示赞赏!

【问题讨论】:

    标签: java ruby scala jar jruby


    【解决方案1】:

    正如jruby documentation 中所述,将 ruby​​ 脚本打包到 jar 中应该很简单,就像将它们包含在 .jar 中(原文如此):

    Java 类路径中的所有内容都被认为是加载路径条目,因此 .rb 脚本(例如,包含在 JAR 文件中)是可加载的。

    在我的情况下它不起作用,因为我在我的脚本 which doesn't seem to work properly in recent release of JRuby 中使用了 require_relative。将 require_relative 替换为 require 使其适用于嵌入在 myApp.jar 中的脚本。

    此外,在 titi.rb 中使用require_relative 'toto' 会触发 titi.rb 脚本未找到的错误,这是一种误导,因为它是 titi.rb 正在执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      相关资源
      最近更新 更多