gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:34 25 4
gpt4 key购买 nike

我正在构建一个 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 制作一个可运行的 jar 并编译 ruby​​ 部分。但是当我运行它时:java -jar myApp.jar,它仍然需要访问我的 myProxy.rb 文件,当然还有所有其他 scrips.rb。因此,在执行此命令时,我需要工作目录中所有 ruby​​ 脚本的副本。

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

我看过warblerrawr 。但是,我不知道这些工具如何在这个混合环境中帮助我(主要是 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.

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

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

关于java - 如何打包成.jar java main + jruby编译类+ ruby​​脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33107280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com