2015-10-13 20 views
1

我正在構建一個使用Ruby中已經開發的某些功能的Spark應用程序。如何在.jar中打包java main + jruby編譯的類+ 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主營:

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

在運行時流looke這樣的:

Main.class(s​​cala) - >調用myProxy.class(編譯myProxy.rb的ruby) - >調用script.rb函數

它的工作原理,我能夠爲Scala和co製作一個可運行的jar mpiled紅寶石部分。但是當我運行它時:java -jar myApp.jar, 它仍然需要訪問我的myProxy.rb文件,當然還有其他所有scrips.rb文件。 因此,我需要在執行此命令時在工作目錄中的所有ruby腳本的副本。

理想情況下,我想在myApp.jar中包含所有ruby腳本,並且能夠輕鬆部署在Spark集羣上進行部署。 這是可能的,以及如何?我看過warblerrawr。但是,我沒有看到這些工具如何幫助我在這個混合環境中(主要在Java中,某些部分編譯了ruby,某些部分是純腳本)。

任何幫助表示讚賞!

回答

0

正如jruby documentation指出,在一個罐子包裝Ruby腳本,應該有簡單的,包括他們在的.jar(原文如此):在Java類路徑

一切都被認爲是一個負載路徑條目,因此例如包含在JAR文件中的.rb腳本是可加載的。

這不是在我的情況下工作,因爲我是用我的劇本require_relativewhich doesn't seem to work properly in recent release of JRuby。替換require_relative要求使其與腳本嵌入myApp.jar一起使用。

titi.rb另外使用require_relative 'toto'被觸發titi.rb腳本的誤差沒有找到,這是誤導,因爲它是titi.rb其中正在執行。

相關問題