Rails 正迅速成為輕量級 Web 應用開發領頭羊。有了 JRuby,Rails 望獲得 Java 程式庫與 JVM 的功能、效能及業界認可度。
JRuby 是面向 Ruby、基於 JVM 的解釋器,結合 Ruby 語言簡易性與強大 JVM 執行機制,含與 Java 程式庫全面整合。Rails 徹底加快並簡化 Web 應用開發,但讓人覺得不夠成熟,特別在高端企業級功能方面。Java 平台與其虛擬機、程式庫、應用伺服器在速度、穩定性、功能持續提升,公認是開發高端伺服器應用領先平台。但若 Java 平台不與 Ruby 等新興語言結合,可能落後於潮流趨勢。
JRuby 結合這些技術互補優點,望提高 Ruby 與 Rails 知名度,同時為 Java 平台運行非 Java 語言賦予新角色。
早期 Java EE 每個組件需大量配置與程式碼。EJB 每個 bean 需多個原始碼與 XML 配置檔,複雜性使 EJB 成重量級開發代名詞,導致 EJB 3 180 度大轉向:追求 POJO bean 冗餘與配置最小化。即使如此,重型 Java EE 應用仍需開發程式碼表示多個軟體層(GUI、業務邏輯、持久層)同一業務物件,並用配置檔粘合。較新的 Seam、Spring 框架用極少配置與程式碼發布業務物件。
Java 框架也向跨 Web 應用多層堆疊標準化整合邁進。早期手寫程式碼從 Servlet 取得 HTML、自建 MVC、用 SQL 而非 JDBC 存取資料庫。後來聚集標籤庫、Struts、Hibernate 等組件。近期 Spring 將大部分功能整合到單一自上而下輕型堆疊。
Rails 從一開始體現簡潔原則:「不要重複自己」與「慣例優於配置」(避免冗餘與有意義預設值為軟體工程古老原則)。框架依簡明慣例推測不同層連接關係。Rails 甚至動態添加屬性反映資料庫欄位:last_name 欄位自動出現 last_name 屬性。特殊情況下仍可用純 Ruby 程式碼或輕量 YAML 格式配置,去除 XML 冗餘括號與結束標籤。
Java 框架向反射與元程式設計邁進。Spring 用反射配合依賴注入串連各部分;標準 Java EE 伺服器通常採靜態方法。Hibernate 用動態元程式設計映射,運行時更新位元碼,而早期資料存取框架需開發時生成大量原始碼或位元碼。Hibernate 開發者只能採用高階技術實現。Ruby 中元程式設計是語言有機部分,Rails 運行時不但能動態生成映射,還能生成存取及顯示底層資料庫所需業務層類別定義,盡量減少此需求。
90 年代末 Java 開發者大量使用 JUnit,但伺服器端應用測試用例編寫總有難度。Spring 生成 Web 應用同時生成測試。Rails 同樣功能,充分利用動態機制與元程式設計支援多種測試:單元、功能、整合測試。
若正使用 Spring、Hibernate 等 Java 框架,無需改變。但若可靈活選擇下一專案新開發方法,請考慮 Rails。
改用新語言常被視為危險,管理層顧慮風險。JRuby 讓 Rails 更易被管理層接受。在 JVM 上, Rails 成一種 Java 框架。如同 JSP 中非 Java 語言實際同樣用於「Java」Web 框架。
如同 C/C++ 撰寫的作業系統為較抽象語言應用提供基礎設施,Java 平台也為 Ruby 等動態語言扮演「系統軟體」角色,提供基礎設施層支援。現可透過 Java 存取眾多功能。JDBC、JMS 等 API 同類中最佳,許多不可替代的內部或獨立軟體廠商企業資訊系統可透過 Java API 存取。Rails 應用透過 JRuby 可像呼叫 Java 程式碼一樣呼叫現有 Java 程式庫。
JRuby 讓 Rails 應用可與 Java Web 應用在現有 Java EE 應用伺服器上共同運行。此類伺服器擁有強大技術基礎設施。人員與培訓方面通常不缺教育計畫與有經驗開發支援人員。只要運行在 JVM 上,即能獲得近十年 JVM 優化項目帶來的好處。
JVM 擁有比 Ruby 複雜得多的安全模型,為 JRuby on Rails 提供處理 Web 應用常見安全難題工具,含控制各來源 Ruby 腳本。還包含內建國際化支援功能。
向動態語言邁進是向更高抽象機制發展一面。在 JVM 管理環境下而非作業系統層面運行 Ruby 解釋器是向更高抽象層邁出一步。使用 Rails 作為 Web 應用層標準實現機制亦然,只把針對特定應用功能留給開發者。
版本號顯示 JRuby 0.9.2 尚未準備好運行生產應用。錯誤待解決;目前 JRuby 速度不如 MRI。搭配 Rails 使用 Java 應用伺服器需非標準適配器 Servlet,建構 WAR 檔需特殊 Ant 腳本,兩者非 JRuby 發行版標準部分。
Rails 處理舊有組件功能特別弱。雖對大多數常見問題支援良好,但缺乏支援替代方案彈性。如 ActiveRecord 假定每個表有名為 id 單一主鍵欄。雖可用鍵欄替換另一名稱,無特殊外掛無法定義多欄鍵。相比之下 Hibernate 等 Java 框架雖簡單情況下開發較慢,但處理極端狀況與舊有程式碼效果好得多。
採用 Rails 面臨主要挑戰在於:是否渴望現有語言與框架統一標準。Rails 適用於此渴望較強烈的新專案與新組織。