企業遷移至 Ruby on Rails 時,往往擁有大量成熟的 Java 業務邏輯(打包為 JAR)。Ruby Java Bridge (RJB) 透過 JNI 讓 Rails 應用直接載入 JVM、實例化 Java 物件、呼叫方法,無需重寫業務邏輯。本文涵蓋 RJB 安裝、環境配置、JAR 載入、類導入、建構子與多載方法處理、完整範例與替代方案對比。
JAVA_HOME)LD_LIBRARY_PATH 指向 $JAVA_HOME/jre/lib/<arch> 及 client 目錄config/environment.rb 中同步設定上述環境變數# 下載源碼編譯安裝
unzip rjb-1.1.3.zip && cd rjb-1.1.3
ruby setup.rb config && ruby setup.rb setup && ruby setup.rb install
# 驗證
irb -r rjb -e "puts 'RJB OK'"
require 'rjb'Rjb::load(classpath, jvmargs) — 啟動 JVM、設定類路徑Rjb::import('fully.qualified.ClassName') — 導入 Java 類ClassName.new_with_sig('signature', args...) — 呼叫多載建構子obj.method(args) 或 obj._invoke('method', 'sig', args) — 呼叫方法require 'rjb'
Rjb::load(classpath = '.:/path/to/tar.jar', jvmargs = [])
TarArchive = Rjb::import('com.ice.tar.TarArchive')
FileInputStream = Rjb::import('java.io.FileInputStream')
File = Rjb::import('java.io.File')
dir = File.new_with_sig('Ljava.lang.String;', '.')
input = FileInputStream.new_with_sig('Ljava.lang.String;', 'test.tar')
archive = TarArchive.new_with_sig('Ljava.io.InputStream;', input)
archive.extractContents(dir)
puts "Done."
new_with_sig 簽名格式參考 Class.getName():Ljava.lang.String;、Ljava.io.InputStream;_invoke('method', 'signature', args) 顯式指定| 維度 | RJB | JRuby |
|---|---|---|
| 架構 | Ruby 原生 + JNI | Ruby 運行於 JVM 之上 |
| 效能 | 僅跨邊界調用慢 | 所有 Ruby 呼叫經 JVM,整體較慢 |
| 遷移成本 | 現有 Rails 無修改 | 需重新部署 JRuby 環境、Gem 相容性 |
| 適用場景 | 少量 Java 邏輯複用 | 全新 JVM 生態專案 |
RJB 讓 Rails 以極低成本復用 Java 資產,適合漸進式遷移。若系統高度依賴 Java 生態,JRuby 則是更徹底的選擇。