十二年之前,Sun公司默默宣布了一種可以使網(wǎng)頁(yè)更動(dòng)感和更富有活力的編程語(yǔ)言及其環(huán)境。當(dāng)然,目前Java語(yǔ)言已經(jīng)成為了一種普遍使用的工具,不僅僅用于為網(wǎng)頁(yè)添加更多的動(dòng)態(tài)效果,還包括創(chuàng)建和生成這些網(wǎng)頁(yè)(透過(guò)servlets和JSP技術(shù)),提供一個(gè)用于事務(wù)性過(guò)程和商業(yè)邏輯的平臺(tái)(透過(guò)EJB技術(shù),即Enterprise Java Beans),訪問(wèn)消息系統(tǒng)(透過(guò)JMS技術(shù),即Java Message Service),訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)(透過(guò)JDBC技術(shù)),甚至于訪問(wèn)不同的主機(jī)(透過(guò)Java Connector API技術(shù))。但這個(gè)故事還遠(yuǎn)遠(yuǎn)沒(méi)有終結(jié),每天,以Java為中心的社區(qū)通過(guò)開源的努力和大量的項(xiàng)目變得越來(lái)越強(qiáng)大,甚至于官方的Java平臺(tái)也不斷地通過(guò)Java Community Process這樣一個(gè)開放性的國(guó)際組織來(lái)進(jìn)行構(gòu)建、成長(zhǎng)和對(duì)自身進(jìn)行增強(qiáng)。

六年之前,微軟大張旗鼓地宣布了一系列嶄新的編程語(yǔ)言和應(yīng)用于各種開發(fā)場(chǎng)景下的環(huán)境。在此之后,.NET已經(jīng)出現(xiàn)了兩個(gè)發(fā)行版本。每一個(gè)主要的發(fā)行版本都會(huì)對(duì)運(yùn)行時(shí)和三款主流的語(yǔ)言(C#,C++和Visual Basic)產(chǎn)生巨大的改變,同時(shí)也會(huì)為客戶層和服務(wù)層帶來(lái)許多新特性,如事務(wù)的支持(System.Transactions),泛型的支持(同時(shí)支持C#和Visual Basic),目錄服務(wù)支持,管理(WMI)等等。這個(gè)故事也遠(yuǎn)遠(yuǎn)沒(méi)有終結(jié),微軟甚至計(jì)劃將一系列新技術(shù)應(yīng)用到其下一個(gè)發(fā)行版本中(NetFX 3.0, 隨Vista發(fā)行)。一個(gè)急速增長(zhǎng)的社區(qū)也依然在不斷擴(kuò)大,并用開源和商業(yè)的新項(xiàng)目以及新構(gòu)想增強(qiáng)了.NET環(huán)境。

在這幾年中,在Java和.NET環(huán)境之間產(chǎn)生了大量的討論,大多數(shù)的討論都強(qiáng)烈地傾向于兩者中的一方,這幾乎沒(méi)有產(chǎn)生任何作用。畢竟,諸如“我的編程語(yǔ)言比你的編程語(yǔ)言要好”或者“我的平臺(tái)比你的平臺(tái)運(yùn)行得要快”,乃至于“你們很遜”這類的話題或許在雞尾酒會(huì)和小組會(huì)議上是一個(gè)你來(lái)我往的頗為有趣的話題,但是這些話題對(duì)于引導(dǎo)一個(gè)有意義的軟件開發(fā)是沒(méi)有任何成效可言的。在經(jīng)歷了立場(chǎng)和姿態(tài)上的對(duì)立以及互相攻擊以后,當(dāng)嘗試使.NET和Java共同工作和對(duì)此進(jìn)行有意義的討論時(shí),這些對(duì)話卻又轉(zhuǎn)向了一些諸如“Web服務(wù)”、“企業(yè)服務(wù)總線”或“面向服務(wù)的體系架構(gòu)”等繁雜的詞匯中,而沒(méi)有任何實(shí)在的展示。當(dāng)越過(guò)這些高層的討論去關(guān)注底層的細(xì)節(jié)時(shí),對(duì)話中經(jīng)常出現(xiàn)的又是SOAP、WSDL和WS協(xié)議,或者通過(guò)消息交換數(shù)據(jù),或者在CLR中實(shí)現(xiàn)JVM,或者在JVM中實(shí)現(xiàn)CLR等。

換句話說(shuō),來(lái)解釋這些流行的用語(yǔ)即“你大步邁進(jìn)并討論這如何去解決這個(gè)問(wèn)題,但是卻從來(lái)沒(méi)有真正得討論為什么你要這樣做” 從歷史的角度看,關(guān)于Java/.NET互操作性的討論降低到了體系結(jié)構(gòu)的次要位置,僅次于“按需”主題——也就是說(shuō)這種互操作的發(fā)生僅僅應(yīng)該在一個(gè)企業(yè)同時(shí)使用.NET和Java系統(tǒng),并且需要在它們之間進(jìn)行對(duì)話時(shí)。盡管如此,在這個(gè)討論中關(guān)于動(dòng)機(jī)問(wèn)題的討論被忽視了——為什么開發(fā)人員想要同時(shí)使用Java和.NET?盡管可能不需要這樣做。

從表面上看來(lái),這是一個(gè)危險(xiǎn)的主題。因?yàn)椴皇怯捎趯?duì)某個(gè)平臺(tái)“不能”做什么的暗示而招致完全的義憤,就是任何關(guān)于某個(gè)平臺(tái)可能在某方面“優(yōu)于”另一個(gè)平臺(tái)的說(shuō)法都會(huì)導(dǎo)致偏愛或無(wú)知的譴責(zé)。(這甚至忽略了一個(gè)基本的問(wèn)題,即指出這里的“優(yōu)于”的定義是什么)。與其無(wú)視或躲避這個(gè)話題,不如直接面對(duì)它。這樣的譴責(zé)和批評(píng)是不應(yīng)該被忽略的,事實(shí)上我們應(yīng)該歡迎它們,并將其作為一個(gè)大討論的一部分,這個(gè)大討論將解答何時(shí)、何地以及如何做出這些決策。盡管這樣,我們認(rèn)為開放式的討論,時(shí)刻檢查思想,允許讀者形成自己的、批判的觀點(diǎn)依然非常重要。

本文作為關(guān)于Java/.NET互操作性主題系列文章中的一篇,也正是基于此觀點(diǎn)進(jìn)行的。

* * *

當(dāng)在大腦中思索什么是Java和.NET都做的好的方面時(shí),有好幾個(gè)場(chǎng)景會(huì)浮現(xiàn)于我們的腦海并值得我們向前探索。

Office客戶端,J2EE服務(wù)器

微軟的Office產(chǎn)品,無(wú)論好壞,即使在有電腦的歷史以來(lái)不是最流行(這里所說(shuō)的流行是指安裝在更多的電腦主機(jī)上)的軟件平臺(tái),也必然是最流行的軟件平臺(tái)之一。目前,Office產(chǎn)品已經(jīng)迎來(lái)了第二個(gè)十年,作為一個(gè)強(qiáng)大的平臺(tái),用戶可以輸入,維護(hù)和查看廣泛的、不同來(lái)源的數(shù)據(jù)。對(duì)于那些目前依賴于J2EE后臺(tái)服務(wù)器的用戶來(lái)說(shuō),既然有相當(dāng)數(shù)量的數(shù)據(jù),那么將這些數(shù)據(jù)轉(zhuǎn)入Office平臺(tái)來(lái)實(shí)現(xiàn)更加簡(jiǎn)單的管理和考察將是一個(gè)很好的考量。更讓人感興趣的是來(lái)考察Office平臺(tái)利用過(guò)程無(wú)關(guān)的通信工具、實(shí)現(xiàn)利用Spring或其他輕型Java容器中業(yè)已實(shí)現(xiàn)的商業(yè)邏輯的方式。

在2006年8月發(fā)行的MSDN雜志發(fā)表了數(shù)篇關(guān)于Office開發(fā)的文章(并為此強(qiáng)烈建議任何對(duì)于Office編程能力不熟悉的人將此作為背景材料),在以“使用Office作為一個(gè)開發(fā)平臺(tái)的須知”為題的一篇文章中,用一個(gè)圖表展示了Office平臺(tái)的全部能力。這里我們沒(méi)有卷帙浩繁地列出完全名單,而是用一塊區(qū)域簡(jiǎn)單列出Office可以與Java平臺(tái)進(jìn)行良好互動(dòng)的幾點(diǎn)特性:

  • 外部自動(dòng)化。由于COM自動(dòng)化技術(shù)的強(qiáng)大,COM自動(dòng)化的后繼者,Visual Studio Tools for Office (VSTO),這個(gè)主要的Office,包括Word、Excel、 Outlook 和其他應(yīng)用程序等,組件可以被外部的應(yīng)用程序接口所驅(qū)動(dòng),因此,各種Office文檔就可以通過(guò)一些通用語(yǔ)言從外部創(chuàng)建。拿Excel的強(qiáng)大的圖表和計(jì)算功能或者Word的強(qiáng)大的編輯和拼寫檢查功能來(lái)說(shuō),考慮在Java應(yīng)用程序如何結(jié)合這些功能來(lái)實(shí)現(xiàn)何種新功能將十分有趣,在服務(wù)器上(如一個(gè)Web應(yīng)用程序可以驅(qū)動(dòng)Word來(lái)創(chuàng)建一個(gè)顧客郵件或者打印由J2EE服務(wù)器傳入的包含特定數(shù)據(jù)元素的報(bào)告文本,就像使用Velocity引擎填充模板生成HTML的方式一樣),或者是在客戶端,利用Eclipse富客戶端平臺(tái),一個(gè)已經(jīng)實(shí)現(xiàn)可以作為COM自動(dòng)化組件的宿主(事實(shí)上,Eclipse可以在一個(gè)安裝有Office的Windows操作系統(tǒng)里創(chuàng)建Word文檔)。當(dāng)用戶僅僅需要查看Word文檔而不是創(chuàng)作Word文檔時(shí),這就顯得尤其重要。微軟提供了一個(gè)免費(fèi)的Word查看程序,如果Java的Web應(yīng)用程序負(fù)責(zé)創(chuàng)建Word文檔,然后通過(guò)HTTP協(xié)議在網(wǎng)絡(luò)上傳送,這樣就可以提供一個(gè)比HTML更加豐富的格式。

  • 插件。Office也可以提供插件功能,一些軟件組件作為插件在Office的內(nèi)部運(yùn)行,通常的情形是將它們自身作為一個(gè)主菜單項(xiàng)或者一個(gè)上下文菜單。一個(gè).NET組件可以將其自身注冊(cè)為一個(gè)Excel電子表格應(yīng)用程序插件,使用一些形式的Java互聯(lián)技術(shù)(Web服務(wù),遠(yuǎn)程調(diào)用工具包或其他過(guò)程內(nèi)宿主)來(lái)連接Java的商業(yè)組件用于驗(yàn)證、數(shù)據(jù)獲取或存儲(chǔ)。比如,很多公司使用Excel作為一個(gè)發(fā)票和/或會(huì)計(jì)解決方案,而且他們可能使用了一些Java組件作為一個(gè)簡(jiǎn)單的進(jìn)出公司會(huì)計(jì)系統(tǒng)的方式。這個(gè)會(huì)計(jì)系統(tǒng)一般是龐大的、基于Java技術(shù)的一個(gè)應(yīng)用程序包,運(yùn)行在一個(gè)企業(yè)級(jí)的服務(wù)器上,通過(guò)EJB中的會(huì)話Bean提供的Java連接器進(jìn)行訪問(wèn)。

  • Excel用戶自定義函數(shù)。Excel在其計(jì)算引擎中已經(jīng)提供調(diào)用用戶自定義函數(shù)功能有非常久的時(shí)間了,從歷史來(lái)看,這些函數(shù)必然是使用非托管的(原始C++)代碼編寫而成,這些代碼為應(yīng)用程序帶來(lái)了危險(xiǎn)的不穩(wěn)定性。創(chuàng)建一個(gè)Excel中的用戶自定義函數(shù)為應(yīng)用程序服務(wù)器中業(yè)已存在的商業(yè)邏輯進(jìn)行一個(gè)簡(jiǎn)單的包裝——比如一個(gè)存貨支票調(diào)用Excel表格模板來(lái)生成一個(gè)訂購(gòu)單——可以提供給對(duì)大多數(shù)Excel用戶來(lái)說(shuō)Excel不曾給過(guò)的強(qiáng)大的在線體驗(yàn)。

  • 智能標(biāo)記。智能標(biāo)記是微軟為文檔中的一些小方框所起的新名稱,這寫文檔中的小方框包含一個(gè)箭頭,一般位于感興趣的內(nèi)容旁邊。在文檔中,智能標(biāo)記經(jīng)常會(huì)被配置和自定義特殊的元素,比如說(shuō)在Word的自動(dòng)糾錯(cuò)中,如果Word認(rèn)為出現(xiàn)了一個(gè)打印錯(cuò)誤,那么在被糾正的單詞上方懸停鼠標(biāo)就會(huì)出現(xiàn)一個(gè)智能標(biāo)記,在沒(méi)有出現(xiàn)真正的錯(cuò)誤的情況下,允許用戶選擇取消這個(gè)糾正。智能標(biāo)記就是插件的一種形式,因此其他幫助用戶彌補(bǔ)客戶端和企業(yè)服務(wù)之間裂痕的可視化輔助組件也可以使用此種形式。

Office同樣為那些使用了綱領(lǐng)性元素的組件和文檔提供了一些部署的支持,因此在很多情況下,在這些組件內(nèi)進(jìn)行功能的升級(jí)就像到一個(gè)共享下載服務(wù)器發(fā)布一些東西一樣簡(jiǎn)單。顯然,一個(gè)主要的考慮是使用Office將出現(xiàn)許可費(fèi)帶來(lái)的成本,但幸運(yùn)的是,大多數(shù)商業(yè)環(huán)境應(yīng)該都已經(jīng)部署了Office環(huán)境,減少了顯著增加的費(fèi)用。

Spring和J2EE容器中的Windwos工作流

Windows工作流是微軟在“NetFX 3.0”發(fā)行版本中的發(fā)行的一個(gè)新框架,它將隨著Windows Vista操作系統(tǒng)被同時(shí)安裝。工作流的目的是提供一個(gè)方法,這個(gè)方法使得商業(yè)過(guò)程功能——或許是一個(gè)小規(guī)模的應(yīng)用,比如網(wǎng)站中網(wǎng)頁(yè)的交互,或許是一個(gè)大規(guī)模的應(yīng)用,比如簽署一個(gè)保險(xiǎn)協(xié)議的主要過(guò)程——可以被非開發(fā)人員創(chuàng)建、查看、跟蹤和編輯等。工作流的開發(fā)人員(或者是傳統(tǒng)的.NET開發(fā)人員,或者是領(lǐng)域?qū)<遥┦褂靡粋€(gè)類似流圖表工具的環(huán)境設(shè)計(jì)工作流,這些工作流由一些活動(dòng)組成,這些活動(dòng)表示過(guò)程當(dāng)中的一個(gè)個(gè)邏輯步驟。這個(gè)環(huán)境將會(huì)隨Visual Studio一起被普遍提供,但是也可以在一些其他自定義的應(yīng)用程序中存在,同樣也允許公司將工作流的設(shè)計(jì)者完全剝離出傳統(tǒng)的程序員工具之外。工作流設(shè)計(jì)的結(jié)果就是一個(gè)格式化的XML文檔或代碼,然后使用工作流編譯器將其編譯成一個(gè).NET類,這個(gè)類將由工作流運(yùn)行時(shí)處理,運(yùn)行于各種環(huán)境之中,包括ASP.NET,控制臺(tái)應(yīng)用程序或者是一個(gè)擁有圖形用戶接口的應(yīng)用程序等。工作流可以是串行的或是由外界狀態(tài)改變驅(qū)動(dòng)的,甚至可以跨越很長(zhǎng)的時(shí)間間隔。

從事實(shí)上看,工作流運(yùn)行時(shí)是被設(shè)計(jì)為易用于各種應(yīng)用環(huán)境和上下文之中,一個(gè)最直接的想法就是使用一些連接技術(shù)將工作流應(yīng)用于Spring(或其他J2EE容器)中,比如可能是工作流運(yùn)行時(shí)支撐Spring容器創(chuàng)建自定義的活動(dòng),以用于調(diào)用Spring中的Bean類執(zhí)行商業(yè)功能,也可能是在Spring的Bean中支撐工作流運(yùn)行時(shí),來(lái)執(zhí)行對(duì)Spring接受的遠(yuǎn)程調(diào)用進(jìn)行響應(yīng)的功能。特別是在第二種情況下,終端用戶可以設(shè)計(jì)業(yè)務(wù)過(guò)程并將其執(zhí)行于傳統(tǒng)的企業(yè)服務(wù)器中。同樣,工作流的狂熱愛好者已經(jīng)描述了工作流可以如何被應(yīng)用,以來(lái)結(jié)構(gòu)化ASP.NET應(yīng)用程序中網(wǎng)頁(yè)的導(dǎo)航,這樣一種方式不同于Structs的action映射文件。在servlet容器中支撐工作流來(lái)完成同樣的目標(biāo)是另一種可行的辦法,同樣也在servlet和JSP網(wǎng)頁(yè)之間提供了一種可見的“流”,而非目前占據(jù)此位置的晦澀的XML語(yǔ)法。

WPF客戶端到Java服務(wù)

本節(jié)將會(huì)描述最后一個(gè),但肯定不是最不重要的場(chǎng)景,而且它有可能成為將.NET和Java在一起使用時(shí)最富有挑戰(zhàn)的場(chǎng)景:在Java強(qiáng)大和可擴(kuò)展的服務(wù)提供的數(shù)據(jù)模型之上(可能是Spring,EJB,或一些組合),使用新的WPF技術(shù)來(lái)提供一個(gè)豐富而強(qiáng)大的用戶界面。WPF所宣稱的基于xaml的編程模型,標(biāo)志著相較于近一個(gè)時(shí)期以來(lái)典型的UI編程模型的重大改變,而且在許多方面都讓人很容易地產(chǎn)生復(fù)雜的用戶界面,這種技術(shù)超出了Swing或SWT目前所能夠?qū)崿F(xiàn)的。另外,由于xaml是一種基于文本的格式,因此可以動(dòng)態(tài)生成XAML并將其下載到客戶端執(zhí)行,就像現(xiàn)在的HTML一樣。

WPF前臺(tái)與Java后臺(tái)之間通過(guò)WCF進(jìn)行對(duì)話將可能稱為一個(gè)典型的場(chǎng)景。WCF是微軟的新的通信管道,使所有的分布式通信編程模式成為一個(gè)單一的架構(gòu)。除了支持許多最新的WS-*規(guī)范,WCF還通過(guò)多種途徑提供了用于通信的豐富的可擴(kuò)展性模型,包括通過(guò)REST格式(有時(shí)稱作普通XML,或POX),甚至可能使用其他的通信媒介,比如UDP。Sun通過(guò)其Tango項(xiàng)目使得這個(gè)辦法更加可行,作為一種特定的設(shè)計(jì)目標(biāo),Tango項(xiàng)目可以與WCF無(wú)縫集成。

* * *

不言而喻,以上這份列表是很難列出Java和.NET之間進(jìn)行可能的互操作的所有場(chǎng)景的。事實(shí)上,為了讓這篇文章處于一個(gè)可控的長(zhǎng)度,在這兒我們忽略了下面幾種可能性:

  • 采用Eclipse的富客戶端平臺(tái)作為客戶端,要么部署一個(gè)通過(guò)由DCOM向.NET/COM+通信的服務(wù)組件,要么部署一個(gè)WCF服務(wù)。

  • 在一臺(tái)部署了Excel計(jì)算引擎的Windows Server 2003機(jī)器中采用Swing客戶端和/或Java Web Start創(chuàng)造一種便攜式、可下載、零部署客戶端應(yīng)用解決方案。

  • 在一個(gè)SWT應(yīng)用程序中利用DirectX提供本地的3D效果(包括音效)。

  • 使用微軟的語(yǔ)音服務(wù)器,以提供交互式語(yǔ)音識(shí)別(IVR),而“前臺(tái)”使用一個(gè)Swing或J2EE應(yīng)用。

等等,等等,等等。

聽起來(lái)好像這一切都是牽強(qiáng)和不合理的煽情,就像在腦海里浮現(xiàn)出那幫擁有大量時(shí)間但卻沒(méi)有常識(shí)的營(yíng)銷人員所作的事。當(dāng)Java擁有公式引擎時(shí)何必使用Excel?當(dāng)我們擁有JAX-WS時(shí)何必使用WCF?當(dāng)我們擁有Java3D時(shí)何必使用WPF?讓我們坦然的面對(duì)如下事實(shí):.NET能做的任何事,Java都可以做到,反之亦然。免得我們因?yàn)槠珢勰稠?xiàng)技術(shù)被指責(zé)。但我們也尤其須要坦白承認(rèn)的一個(gè)事實(shí)是:兩種平臺(tái)各有特殊的興趣領(lǐng)域,并且它們?cè)诟髯缘念I(lǐng)域做得都很好。開發(fā)人員愿意拋開立場(chǎng)偏見,進(jìn)行開明的討論,并發(fā)揮各自平臺(tái)的優(yōu)勢(shì)以導(dǎo)致一些更大的利益。或是寬泛地引用卡爾?馬克斯的一句名言,“對(duì)每一個(gè)項(xiàng)目而言,應(yīng)該根據(jù)自己的需要充分發(fā)揮其所需平臺(tái)的能力。”( From each platform, according to its abilities, to each project, according to its needs.)

查看英文原文:Java, .NET, But Why Together?