十二年之前,Sun公司默默宣布了一種可以使網(wǎng)頁更動感和更富有活力的編程語言及其環(huán)境。當(dāng)然,目前Java語言已經(jīng)成為了一種普遍使用的工具,不僅僅用于為網(wǎng)頁添加更多的動態(tài)效果,還包括創(chuàng)建和生成這些網(wǎng)頁(透過servlets和JSP技術(shù)),提供一個用于事務(wù)性過程和商業(yè)邏輯的平臺(透過EJB技術(shù),即Enterprise Java Beans),訪問消息系統(tǒng)(透過JMS技術(shù),即Java MessageService),訪問關(guān)系型數(shù)據(jù)庫(透過JDBC技術(shù)),甚至于訪問不同的主機(jī)(透過Java ConnectorAPI技術(shù))。但這個故事還遠(yuǎn)遠(yuǎn)沒有終結(jié),每天,以Java為中心的社區(qū)通過開源的努力和大量的項目變得越來越強(qiáng)大,甚至于官方的Java平臺也不斷地通過Java Community Process這樣一個開放性的國際組織來進(jìn)行構(gòu)建、成長和對自身進(jìn)行增強(qiáng)。
六年之前,微軟大張旗鼓地宣布了一系列嶄新的編程語言和應(yīng)用于各種開發(fā)場景下的環(huán)境。在此之后,.NET已經(jīng)出現(xiàn)了兩個發(fā)行版本。每一個主要的發(fā)行版本都會對運(yùn)行時和三款主流的語言(C#,C++和VisualBasic)產(chǎn)生巨大的改變,同時也會為客戶層和服務(wù)層帶來許多新特性,如事務(wù)的支持(System.Transactions),泛型的支持(同時支持C#和VisualBasic),目錄服務(wù)支持,管理(WMI)等等。這個故事也遠(yuǎn)遠(yuǎn)沒有終結(jié),微軟甚至計劃將一系列新技術(shù)應(yīng)用到其下一個發(fā)行版本中(NetFX3.0, 隨Vista發(fā)行)。一個急速增長的社區(qū)也依然在不斷擴(kuò)大,并用開源和商業(yè)的新項目以及新構(gòu)想增強(qiáng)了.NET環(huán)境。
在這幾年中,在Java和.NET環(huán)境之間產(chǎn)生了大量的討論,大多數(shù)的討論都強(qiáng)烈地傾向于兩者中的一方,這幾乎沒有產(chǎn)生任何作用。畢竟,諸如“我的編程語言比你的編程語言要好”或者“我的平臺比你的平臺運(yùn)行得要快”,乃至于“你們很遜”這類的話題或許在雞尾酒會和小組會議上是一個你來我往的頗為有趣的話題,但是這些話題對于引導(dǎo)一個有意義的軟件開發(fā)是沒有任何成效可言的。在經(jīng)歷了立場和姿態(tài)上的對立以及互相攻擊以后,當(dāng)嘗試使.NET和Java共同工作和對此進(jìn)行有意義的討論時,這些對話卻又轉(zhuǎn)向了一些諸如“Web服務(wù)”、“企業(yè)服務(wù)總線”或“面向服務(wù)的體系架構(gòu)”等繁雜的詞匯中,而沒有任何實(shí)在的展示。當(dāng)越過這些高層的討論去關(guān)注底層的細(xì)節(jié)時,對話中經(jīng)常出現(xiàn)的又是SOAP、WSDL和WS協(xié)議,或者通過消息交換數(shù)據(jù),或者在CLR中實(shí)現(xiàn)JVM,或者在JVM中實(shí)現(xiàn)CLR等。
換句話說,來解釋這些流行的用語即“你大步邁進(jìn)并討論這如何去解決這個問題,但是卻從來沒有真正得討論為什么你要這樣做”從歷史的角度看,關(guān)于Java/.NET互操作性的討論降低到了體系結(jié)構(gòu)的次要位置,僅次于“按需”主題——也就是說這種互操作的發(fā)生僅僅應(yīng)該在一個企業(yè)同時使用.NET和Java系統(tǒng),并且需要在它們之間進(jìn)行對話時。盡管如此,在這個討論中關(guān)于動機(jī)問題的討論被忽視了——為什么開發(fā)人員想要同時使用Java和.NET?盡管可能不需要這樣做。
從表面上看來,這是一個危險的主題。因為不是由于對某個平臺“不能”做什么的暗示而招致完全的義憤,就是任何關(guān)于某個平臺可能在某方面“優(yōu)于”另一個平臺的說法都會導(dǎo)致偏愛或無知的譴責(zé)。(這甚至忽略了一個基本的問題,即指出這里的“優(yōu)于”的定義是什么)。與其無視或躲避這個話題,不如直接面對它。這樣的譴責(zé)和批評是不應(yīng)該被忽略的,事實(shí)上我們應(yīng)該歡迎它們,并將其作為一個大討論的一部分,這個大討論將解答何時、何地以及如何做出這些決策。盡管這樣,我們認(rèn)為開放式的討論,時刻檢查思想,允許讀者形成自己的、批判的觀點(diǎn)依然非常重要。
本文作為關(guān)于Java/.NET互操作性主題系列文章中的一篇,也正是基于此觀點(diǎn)進(jìn)行的。
* * *
當(dāng)在大腦中思索什么是Java和.NET都做的好的方面時,有好幾個場景會浮現(xiàn)于我們的腦海并值得我們向前探索。
微軟的Office產(chǎn)品,無論好壞,即使在有電腦的歷史以來不是最流行(這里所說的流行是指安裝在更多的電腦主機(jī)上)的軟件平臺,也必然是最流行的軟件平臺之一。目前,Office產(chǎn)品已經(jīng)迎來了第二個十年,作為一個強(qiáng)大的平臺,用戶可以輸入,維護(hù)和查看廣泛的、不同來源的數(shù)據(jù)。對于那些目前依賴于J2EE后臺服務(wù)器的用戶來說,既然有相當(dāng)數(shù)量的數(shù)據(jù),那么將這些數(shù)據(jù)轉(zhuǎn)入Office平臺來實(shí)現(xiàn)更加簡單的管理和考察將是一個很好的考量。更讓人感興趣的是來考察Office平臺利用過程無關(guān)的通信工具、實(shí)現(xiàn)利用Spring或其他輕型Java容器中業(yè)已實(shí)現(xiàn)的商業(yè)邏輯的方式。
在2006年8月發(fā)行的MSDN雜志發(fā)表了數(shù)篇關(guān)于Office開發(fā)的文章(并為此強(qiáng)烈建議任何對于Office編程能力不熟悉的人將此作為背景材料),在以“使用Office作為一個開發(fā)平臺的須知”為題的一篇文章中,用一個圖表展示了Office平臺的全部能力。這里我們沒有卷帙浩繁地列出完全名單,而是用一塊區(qū)域簡單列出Office可以與Java平臺進(jìn)行良好互動的幾點(diǎn)特性:
外部自動化。由于COM自動化技術(shù)的強(qiáng)大,COM自動化的后繼者, Visual Studio Tools for Office (VSTO),這個主要的Office,包括Word、Excel、 Outlook 和其他應(yīng)用程序等,組件可以被外部的應(yīng)用程序接口所驅(qū)動,因此,各種Office文檔就可以通過一些通用語言從外部創(chuàng)建。拿Excel的強(qiáng)大的圖表和計算 功能或者Word的強(qiáng)大的編輯和拼寫檢查功能來說,考慮在Java應(yīng)用程序如何結(jié)合這些功能來實(shí)現(xiàn)何種新功能將十分有趣,在服務(wù)器上(如一個Web應(yīng)用程 序可以驅(qū)動Word來創(chuàng)建一個顧客郵件或者打印由J2EE服務(wù)器傳入的包含特定數(shù)據(jù)元素的報告文本,就像使用Velocity引擎填充模板生成HTML的 方式一樣),或者是在客戶端,利用Eclipse富客戶端平臺,一個已經(jīng)實(shí)現(xiàn)可以作為COM自動化組件的宿主(事實(shí)上,Eclipse可以在一個安裝有 Office的Windows操作系統(tǒng)里創(chuàng)建Word文檔)。當(dāng)用戶僅僅需要查看Word文檔而不是創(chuàng)作Word文檔時,這就顯得尤其重要。微軟提供了一 個免費(fèi)的Word查看程序,如果Java的Web應(yīng)用程序負(fù)責(zé)創(chuàng)建Word文檔,然后通過HTTP協(xié)議在網(wǎng)絡(luò)上傳送,這樣就可以提供一個比HTML更加豐 富的格式。
插件。Office也可以提供插件 功能,一些軟件組件作為插件在Office的內(nèi)部運(yùn)行,通常的情形是將它們自身作為一個主菜單項或者一個上下文菜單。一個.NET組件可以將其自身注冊為 一個Excel電子表格應(yīng)用程序插件,使用一些形式的Java互聯(lián)技術(shù)(Web服務(wù),遠(yuǎn)程調(diào)用工具包或其他過程內(nèi)宿主)來連接Java的商業(yè)組件用于驗 證、數(shù)據(jù)獲取或存儲。比如,很多公司使用Excel作為一個發(fā)票和/或會計解決方案,而且他們可能使用了一些Java組件作為一個簡單的進(jìn)出公司會計系統(tǒng) 的方式。這個會計系統(tǒng)一般是龐大的、基于Java技術(shù)的一個應(yīng)用程序包,運(yùn)行在一個企業(yè)級的服務(wù)器上,通過EJB中的會話Bean提供的Java連接器進(jìn) 行訪問。
Excel用戶自定義函數(shù)。Excel 在其計算引擎中已經(jīng)提供調(diào)用用戶自定義函數(shù)功能有非常久的時間了,從歷史來看,這些函數(shù)必然是使用非托管的(原始C++)代碼編寫而成,這些代碼為應(yīng)用程 序帶來了危險的不穩(wěn)定性。創(chuàng)建一個Excel中的用戶自定義函數(shù)為應(yīng)用程序服務(wù)器中業(yè)已存在的商業(yè)邏輯進(jìn)行一個簡單的包裝——比如一個存貨支票調(diào)用 Excel表格模板來生成一個訂購單——可以提供給對大多數(shù)Excel用戶來說Excel不曾給過的強(qiáng)大的在線體驗。
智能標(biāo)記。智 能標(biāo)記是微軟為文檔中的一些小方框所起的新名稱,這寫文檔中的小方框包含一個箭頭,一般位于感興趣的內(nèi)容旁邊。在文檔中,智能標(biāo)記經(jīng)常會被配置和自定義特 殊的元素,比如說在Word的自動糾錯中,如果Word認(rèn)為出現(xiàn)了一個打印錯誤,那么在被糾正的單詞上方懸停鼠標(biāo)就會出現(xiàn)一個智能標(biāo)記,在沒有出現(xiàn)真正的 錯誤的情況下,允許用戶選擇取消這個糾正。智能標(biāo)記就是插件的一種形式,因此其他幫助用戶彌補(bǔ)客戶端和企業(yè)服務(wù)之間裂痕的可視化輔助組件也可以使用此種形 式。
Office同樣為那些使用了綱領(lǐng)性元素的組件和文檔提供了一些部署的支持,因此在很多情況下,在這些組件內(nèi)進(jìn)行功能的升級就像到一個共享下載服務(wù)器發(fā)布一些東西一樣簡單。顯然,一個主要的考慮是使用Office將出現(xiàn)許可費(fèi)帶來的成本,但幸運(yùn)的是,大多數(shù)商業(yè)環(huán)境應(yīng)該都已經(jīng)部署了Office環(huán)境,減少了顯著增加的費(fèi)用。
Windows工作流是微軟在“NetFX 3.0”發(fā)行版本中的發(fā)行的一個新框架,它將隨著WindowsVista操作系統(tǒng)被同時安裝。工作流的目的是提供一個方法,這個方法使得商業(yè)過程功能——或許是一個小規(guī)模的應(yīng)用,比如網(wǎng)站中網(wǎng)頁的交互,或許是一個大規(guī)模的應(yīng)用,比如簽署一個保險協(xié)議的主要過程——可以被非開發(fā)人員創(chuàng)建、查看、跟蹤和編輯等。工作流的開發(fā)人員(或者是傳統(tǒng)的.NET開發(fā)人員,或者是領(lǐng)域?qū)<遥┦褂靡粋€類似流圖表工具的環(huán)境設(shè)計工作流,這些工作流由一些活動組成,這些活動表示過程當(dāng)中的一個個邏輯步驟。這個環(huán)境將會隨VisualStudio一起被普遍提供,但是也可以在一些其他自定義的應(yīng)用程序中存在,同樣也允許公司將工作流的設(shè)計者完全剝離出傳統(tǒng)的程序員工具之外。工作流設(shè)計的結(jié)果就是一個格式化的XML文檔或代碼,然后使用工作流編譯器將其編譯成一個.NET類,這個類將由工作流運(yùn)行時處理,運(yùn)行于各種環(huán)境之中,包括ASP.NET,控制臺應(yīng)用程序或者是一個擁有圖形用戶接口的應(yīng)用程序等。工作流可以是串行的或是由外界狀態(tài)改變驅(qū)動的,甚至可以跨越很長的時間間隔。
從事實(shí)上看,工作流運(yùn)行時是被設(shè)計為易用于各種應(yīng)用環(huán)境和上下文之中,一個最直接的想法就是使用一些連接技術(shù)將工作流應(yīng)用于Spring(或其他J2EE容器)中,比如可能是工作流運(yùn)行時支撐Spring容器創(chuàng)建自定義的活動,以用于調(diào)用Spring中的Bean類執(zhí)行商業(yè)功能,也可能是在Spring的Bean中支撐工作流運(yùn)行時,來執(zhí)行對Spring接受的遠(yuǎn)程調(diào)用進(jìn)行響應(yīng)的功能。特別是在第二種情況下,終端用戶可以設(shè)計業(yè)務(wù)過程并將其執(zhí)行于傳統(tǒng)的企業(yè)服務(wù)器中。同樣,工作流的狂熱愛好者已經(jīng)描述了工作流可以如何被應(yīng)用,以來結(jié)構(gòu)化ASP.NET應(yīng)用程序中網(wǎng)頁的導(dǎo)航,這樣一種方式不同于Structs的action映射文件。在servlet容器中支撐工作流來完成同樣的目標(biāo)是另一種可行的辦法,同樣也在servlet和JSP網(wǎng)頁之間提供了一種可見的“流”,而非目前占據(jù)此位置的晦澀的XML語法。
本節(jié)將會描述最后一個,但肯定不是最不重要的場景,而且它有可能成為將.NET和Java在一起使用時最富有挑戰(zhàn)的場景:在Java強(qiáng)大和可擴(kuò)展的服務(wù)提供的數(shù)據(jù)模型之上(可能是Spring,EJB,或一些組合),使用新的WPF技術(shù)來提供一個豐富而強(qiáng)大的用戶界面。WPF所宣稱的基于xaml的編程模型,標(biāo)志著相較于近一個時期以來典型的UI編程模型的重大改變,而且在許多方面都讓人很容易地產(chǎn)生復(fù)雜的用戶界面,這種技術(shù)超出了Swing或SWT目前所能夠?qū)崿F(xiàn)的。另外,由于xaml是一種基于文本的格式,因此可以動態(tài)生成XAML并將其下載到客戶端執(zhí)行,就像現(xiàn)在的HTML一樣。
WPF前臺與Java后臺之間通過WCF進(jìn)行對話將可能稱為一個典型的場景。WCF是微軟的新的通信管道,使所有的分布式通信編程模式成為一個單一的架構(gòu)。除了支持許多最新的WS-*規(guī)范,WCF還通過多種途徑提供了用于通信的豐富的可擴(kuò)展性模型,包括通過REST格式(有時稱作普通XML,或POX),甚至可能使用其他的通信媒介,比如UDP。Sun通過其Tango項目使得這個辦法更加可行,作為一種特定的設(shè)計目標(biāo),Tango項目可以與WCF無縫集成。
* * *
不言而喻,以上這份列表是很難列出Java和.NET之間進(jìn)行可能的互操作的所有場景的。事實(shí)上,為了讓這篇文章處于一個可控的長度,在這兒我們忽略了下面幾種可能性:
采用Eclipse的富客戶端平臺作為客戶端,要么部署一個通過由DCOM向.NET/COM+通信的服務(wù)組件,要么部署一個WCF服務(wù)。
在一臺部署了Excel計算引擎的Windows Server 2003機(jī)器中采用Swing客戶端和/或Java Web Start創(chuàng)造一種便攜式、可下載、零部署客戶端應(yīng)用解決方案。
在一個SWT應(yīng)用程序中利用DirectX提供本地的3D效果(包括音效)。
使用微軟的語音服務(wù)器,以提供交互式語音識別(IVR),而“前臺”使用一個Swing或J2EE應(yīng)用。
等等,等等,等等。
聽起來好像這一切都是牽強(qiáng)和不合理的煽情,就像在腦海里浮現(xiàn)出那幫擁有大量時間但卻沒有常識的營銷人員所作的事。當(dāng)Java擁有公式引擎時何必使用Excel?當(dāng)我們擁有JAX-WS時何必使用WCF?當(dāng)我們擁有Java3D時何必使用WPF?讓我們坦然的面對如下事實(shí):.NET能做的任何事,Java都可以做到,反之亦然。免得我們因為偏愛某項技術(shù)被指責(zé)。但我們也尤其須要坦白承認(rèn)的一個事實(shí)是:兩種平臺各有特殊的興趣領(lǐng)域,并且它們在各自的領(lǐng)域做得都很好。開發(fā)人員愿意拋開立場偏見,進(jìn)行開明的討論,并發(fā)揮各自平臺的優(yōu)勢以導(dǎo)致一些更大的利益?;蚴菍挿旱匾每?馬克斯的一句名言,“對每一個項目而言,應(yīng)該根據(jù)自己的需要充分發(fā)揮其所需平臺的能力。”( From each platform, according to itsabilities, to each project, according to its needs.)
查看英文原文:Java, .NET, But Why Together?譯者簡介:張立,博士研究生,喜歡新技術(shù),新思想。經(jīng)歷了一些企業(yè)級軟件開發(fā)后,逐漸將興趣轉(zhuǎn)向C#和JAVA的企業(yè)級應(yīng)用。同時對動態(tài)語言的發(fā)展非常關(guān)注,喜歡用Python進(jìn)行一些計算,對Ruby也傾注了一定的精力。大部分時間在學(xué)校從事一些理論研究,工作之余關(guān)注開源軟件的進(jìn)展。
聯(lián)系客服