如何打包成.jar java main + jruby compiled class + ruby script?
How to package in a .jar java main + jruby compiled class + ruby script?
我正在构建一个 Spark 应用程序,它利用 Ruby 中已经开发的一些功能。
我选择通过在 ruby 中定义 MyProxy
class 并使用 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 制作一个可运行的 jar 并编译 ruby 部分。但是当我 运行 它时: java -jar myApp.jar
,
它仍然需要访问我的 myProxy.rb 文件,当然还有所有其他 scrips.rb。
因此,在执行此命令时,我需要工作目录中所有 ruby 脚本的副本。
理想情况下,我还想在 myApp.jar 中包含所有 ruby 脚本,并且能够轻松部署到 spark 集群上。
这可能吗?如何实现?
我看过warbler and rawr。但是,我看不出这些工具如何在这个混合环境中帮助我(主要在 Java,部分编译 ruby,部分纯脚本)。
感谢任何帮助!
如 jruby documentation 所述,将 ruby 脚本打包到 jar 中,应该很简单,只需将它们包含在 .jar 中(原文如此):
Everything in the Java classpath is considered to be a load path entry, so .rb scripts, for example, contained in JAR files, are loadable.
它在我的案例中不起作用,因为我在我的脚本 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。
我正在构建一个 Spark 应用程序,它利用 Ruby 中已经开发的一些功能。
我选择通过在 ruby 中定义 MyProxy
class 并使用 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 制作一个可运行的 jar 并编译 ruby 部分。但是当我 运行 它时: java -jar myApp.jar
,
它仍然需要访问我的 myProxy.rb 文件,当然还有所有其他 scrips.rb。
因此,在执行此命令时,我需要工作目录中所有 ruby 脚本的副本。
理想情况下,我还想在 myApp.jar 中包含所有 ruby 脚本,并且能够轻松部署到 spark 集群上。 这可能吗?如何实现?
我看过warbler and rawr。但是,我看不出这些工具如何在这个混合环境中帮助我(主要在 Java,部分编译 ruby,部分纯脚本)。
感谢任何帮助!
如 jruby documentation 所述,将 ruby 脚本打包到 jar 中,应该很简单,只需将它们包含在 .jar 中(原文如此):
Everything in the Java classpath is considered to be a load path entry, so .rb scripts, for example, contained in JAR files, are loadable.
它在我的案例中不起作用,因为我在我的脚本 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。