JRuby是面向Ruby、基于Java虛擬機(jī)(JVM)的一種解釋程序,它結(jié)合了Ruby語(yǔ)言的簡(jiǎn)易性和功能強(qiáng)大的JVM的執(zhí)行機(jī)制,包括與Java庫(kù)全面集成。Rails徹底加快及簡(jiǎn)化了Web應(yīng)用的開發(fā),不過它讓人覺得不夠成熟,特別是在高端企業(yè)級(jí)功能方面。另一方面,Java平臺(tái)及其虛擬機(jī)、庫(kù)和應(yīng)用服務(wù)器的速度、穩(wěn)定性和功能方面卻一直在提升,現(xiàn)在已被公認(rèn)為是開發(fā)高端服務(wù)器應(yīng)用的領(lǐng)先平臺(tái)。不過如果Java平臺(tái)不與Ruby等新興語(yǔ)言聯(lián)系在一起,就有可能落后于流行趨勢(shì)。
JRuby結(jié)合了所有這些技術(shù)互為補(bǔ)充的優(yōu)點(diǎn),有望提高Ruby和Rails的知名度,同時(shí)為Java平臺(tái)在運(yùn)行非Java語(yǔ)言方面賦予新角色。
Rails: Java框架的發(fā)展方向
對(duì)Java開發(fā)人員而言,Rails就像是自然代表了諸多Java Web框架的發(fā)展趨勢(shì):減少不必要的代碼、采更多的抽象和動(dòng)態(tài)機(jī)制,以及更全面的即開即用功能。
約定優(yōu)于配置
早期版本的Java平臺(tái)企業(yè)版(Java EE)每個(gè)組件需要有大量的配置和代碼。譬如說,Enterprise JavaBeans的每個(gè)bean要有多個(gè)源代碼和XML配置文件。這種復(fù)雜性使得EJB成了重量級(jí)開發(fā)的代名詞,最終導(dǎo)致EJB 3出現(xiàn)了180度大轉(zhuǎn)變: 力求普通Java對(duì)象(POJO)bean的冗余和配置最小。即使如此,重型Java EE應(yīng)用程序仍需要開發(fā)人員開發(fā)代碼來表示多個(gè)軟件層(包括GUI、業(yè)務(wù)邏輯和持久層)上的同一業(yè)務(wù)對(duì)象。然后,盡管層與層之間存在冗余性和相似性,開發(fā)人員仍必須用配置文件把這些層粘合起來。相比之下,像Seam和Spring這些比較新的Java Web框架使用極少的配置和代碼,就可以發(fā)布業(yè)務(wù)對(duì)象。
Java框架也一直在向跨Web應(yīng)用程序的多個(gè)層對(duì)堆棧進(jìn)行標(biāo)準(zhǔn)化和集成邁進(jìn)。在早期,Java Web應(yīng)用開發(fā)人員手工編寫代碼,從服務(wù)器小程序獲得HTML輸出;創(chuàng)建自己的模型-視圖-控制器(MCV)架構(gòu),并使用SQL而不是Java數(shù)據(jù)庫(kù)連接(JDBC)來訪問數(shù)據(jù)庫(kù)。后來,他們聚集了執(zhí)行大部分通用功能的組件,譬如標(biāo)記庫(kù)、Struts和Hibernate。最近,Spring將大部分功能集成到了單一、自上而下的輕型堆棧。
從一開始,Rails就體現(xiàn)了這些簡(jiǎn)潔性原則,這些原則在Rails社區(qū)中稱為“不要重復(fù)自己”和“約定優(yōu)于配置”(避免冗余和有意義的默認(rèn)值是軟件工程領(lǐng)域中的兩條古老原則)。該框架可以根據(jù)簡(jiǎn)明的約定,猜出不同層的連接關(guān)系。Rails甚至可以顯式、動(dòng)態(tài)添加屬性從而反射數(shù)據(jù)庫(kù)列: last_name列會(huì)自動(dòng)使last_name屬性出現(xiàn)。
在約定不能滿足要求的特殊情況下,仍可以使用純Ruby代碼或者類似Ruby的輕型YAML格式來添加配置,這兩種格式都刪去了XML的冗余方括號(hào)和結(jié)束標(biāo)記。
動(dòng)態(tài)和反射機(jī)制
Java框架也一直在向反射和元編程機(jī)制使用更廣泛而邁進(jìn)。譬如說,Spring使用反射機(jī)制,利用依賴注入把各部分連接起來;標(biāo)準(zhǔn)的Java EE服務(wù)器系列則通常采用靜態(tài)方法。Hibernate這種流行的對(duì)象關(guān)系映射框架利用動(dòng)態(tài)元編程進(jìn)行映射,在運(yùn)行時(shí)更新字節(jié)碼,而不像早期的數(shù)據(jù)訪問框架需要在開發(fā)時(shí)生成大量的源代碼或者字節(jié)碼。
Hibernate的開發(fā)人員之前只好采用一些高級(jí)技術(shù)來實(shí)現(xiàn)這項(xiàng)功能。而在Ruby中,元編程卻是這種語(yǔ)言的一個(gè)有機(jī)部分,結(jié)果Rails在運(yùn)行時(shí)不但能動(dòng)態(tài)生成映射,還能生成訪問及顯示底層數(shù)據(jù)庫(kù)所需的業(yè)務(wù)層類定義,從而盡量減少了這種需要。
支持開發(fā)過程
上世紀(jì)90年代末前后,Java開發(fā)人員大量使用JUnit框架的測(cè)試方法,但為服務(wù)器端應(yīng)用程序編寫測(cè)試用例總是有難度的。如今Spring在生成Web應(yīng)用程序的同時(shí)還能生成測(cè)試。Rails具有同樣功能,充分利用了動(dòng)態(tài)機(jī)制和元編程技術(shù)來支持多種測(cè)試: 單元測(cè)試、功能測(cè)試以及集成測(cè)試。
為什么在JVM上運(yùn)行Rails
如果你現(xiàn)在正在使用Spring和Hibernate等Java框架,那就用不著改變。但如果可以靈活地為下一個(gè)項(xiàng)目選擇新的開發(fā)方法,不妨考慮Rails。
遺憾的是,改用一種新語(yǔ)言一般被認(rèn)為是危險(xiǎn)舉措,管理人員對(duì)風(fēng)險(xiǎn)有顧慮。JRuby能夠讓Rails更容易被管理人員所接受。在JVM上,Rails成了一種Java框架。譬如說,“Java”Web框架中的非Java語(yǔ)言實(shí)際上同樣用于JavaServer Pages中。
就像通常用C/C++編寫的操作系統(tǒng)為使用比較抽象的語(yǔ)言編寫的應(yīng)用程序提供了基礎(chǔ)架構(gòu)一樣,Java平臺(tái)也為Ruby等動(dòng)態(tài)語(yǔ)言扮演“系統(tǒng)軟件”的角色,提供了基礎(chǔ)架構(gòu)層面的支持。如今可以通過Java訪問眾多的功能。JDBC和Java消息服務(wù)(JMS)等API是同類中最佳的,而許多不可替代的內(nèi)部或者獨(dú)立軟件開發(fā)商的企業(yè)信息系統(tǒng)可以通過Java API來訪問。Rails應(yīng)用程序通過使用JRuby,可以像調(diào)用Java代碼那樣調(diào)用現(xiàn)有的Java庫(kù)。
有了JRuby,Rails應(yīng)用程序可與Java Web應(yīng)用程序在現(xiàn)有的Java EE應(yīng)用服務(wù)器上一起運(yùn)行。這種應(yīng)用服務(wù)器擁有強(qiáng)大的技術(shù)基礎(chǔ)架構(gòu)。在人員和培訓(xùn)方面,通常不缺乏教育計(jì)劃以及有經(jīng)驗(yàn)的開發(fā)和支持人員。另外只要運(yùn)行在JVM上,這種應(yīng)用服務(wù)器就能夠獲得最近十年在JVM方面投入的許多優(yōu)化項(xiàng)目所帶來的好處。
JVM擁有比Ruby復(fù)雜得多的安全模型,為JRuby on Rails提供了處理Web應(yīng)用程序的常見安全難題的工具,包括控制從各個(gè)來源獲得的Ruby腳本。它還包含了內(nèi)部支持國(guó)際化的功能。
向動(dòng)態(tài)語(yǔ)言邁進(jìn),這是在抽象機(jī)制方面向更高級(jí)語(yǔ)言發(fā)展的一個(gè)方面。在JVM的管理環(huán)境下而不是在操作系統(tǒng)層面上運(yùn)行Ruby解釋程序又是向更高抽象層邁出的一步。使用Rails作為Web應(yīng)用程序?qū)拥臉?biāo)準(zhǔn)實(shí)現(xiàn)機(jī)制也是如此,只把針對(duì)特定應(yīng)用程序的功能留給了開發(fā)人員。
鏈接:JRuby面臨的難題
正如版本號(hào)所示,JRuby 0.9.2還沒有準(zhǔn)備好運(yùn)行生產(chǎn)應(yīng)用程序。一些錯(cuò)誤有待解決;另外,目前JRuby的速度不如MRI。與Rails一起使用Java應(yīng)用服務(wù)器需要非標(biāo)準(zhǔn)的適配器服務(wù)器小程序,而構(gòu)建war文件需要特殊的Ant腳本,這兩者還不是JRuby發(fā)行版的標(biāo)準(zhǔn)部分。
Rails在處理遺留組件方面的功能特別弱。雖然Rails為解決大多數(shù)常見問題提供了很好的支持,但缺少支持替代方案的靈活性。譬如說,活動(dòng)記錄假定每個(gè)表都有一個(gè)名為id的單一主鍵列。雖然可以用鍵列代替另一個(gè)名稱,要是不使用特殊插件,就無法定義多列鍵。相比之下,Hibernate等Java框架雖然在簡(jiǎn)單(且常見)的情況下開發(fā)速度比較慢,但處理極端狀況和遺留代碼的效果比Rails好得多。
最終,采用Rails面臨的主要難題在于,是否渴望現(xiàn)有語(yǔ)言和框架方面統(tǒng)一標(biāo)準(zhǔn)。Rails適用于這種渴望比較強(qiáng)烈的新項(xiàng)目和新組織。
jwebee
我的個(gè)人網(wǎng)站
posted on 2007-10-08 11:42
周行 閱讀(211)
評(píng)論(0) 編輯 收藏 所屬分類:
ruby