Jacek Furmankiewicz是加拿大Compuware公司一位資深的開發者/設計者。他具有12年的專業IT經驗,范圍涉及UNIX,PowerBuilder,C#/Microsoft .NET,Java,PHP,還有Microsoft SQL Server和Oracle。
一、引言
自從前幾年Eclipse加入到Java開發IDE大軍中以後,情況對於Java開發者簡直發生了戲劇性的變化。SWT與Swing兩種工具包各有自己的優缺點,而且在性能及外觀點都沒有遠遠壓倒對方的強項,Eclipse以其明顯的優勢—獨特的性能,易於上手和高生產效率—跨入Java IDE行列中。本文旨在對三個主流Java IDE—NetBeans,IntelliJ IDEA和Eclipse—的常規特征(安裝、性能及編輯器,等)進行對比分析,但仍然把重點放在Swing,JSP/Struts,JavaServer Faces(JSF)以及J2EE/EJB 3.0開發等重點領域特征的比較上。在必要的情況下,也對JPA(Java持久性API)支持方面進行適當評價。
在上面三個IDE中,Eclipse是唯一的存在多個發行版本的IDE:從基本發行版本到帶有額外開源插件的預包裝版本(例如EasyEclipse),再到開源/商業型的混合版本(例如Genuitec的MyEclipse)。為了對Eclipse的功能提供比較中肯的評論,我在本文中主要針對其基本發行版本(包括缺省的Eclipse子工程—例如Visual Editor和Web Tools Project)。每當討論到它所缺乏的功能時,我往往還要提到商業版的MyEclipse所提供的功能。坦率地說,我很難發現還有哪一種商業IDE會以每年49美元的訂閱價格提供如MyEclipse所提供的那種優質的功能。
首先,讓我們來討論NetBeans 5.5。
二、NetBeans 5.5
供應商 Sun Microsystems 網站 www.netbeans.org 價格 免費/開源 分發 基本內容+Enterprise Pack+Visual Web Pack
安裝
NetBeans 5.5及其它發行包(例如,帶有UML/BPEL/SOA支持的Enterprise Pack和支持JSF開發的Visual Web Pack)既可以ZIP包形式下載也可以以跨平台InstallShield安裝程序方式進行安裝。在Windows平台上,該安裝程序與OS無縫地集成到一起—包括創建適當的桌面快捷方式以及在“添加/刪除程序”面板中添加一個卸載程序。在Linux平台上,它僅被安裝到指定的目錄下並且在GNOME或KDE桌面上創建一個啟動圖標。遺憾的是,它並沒有作為一個RPM或一個.deb文件形式發行,也沒有提供一個標准數據倉庫形式,這允許Linux用戶可以象他們安裝任何其它應用程序一樣來安裝它。
總體特征
在早期版本中,NetBeans基於Swing進行開發,致使表現得緩慢、龐大且界面丑陋,使人使用起來很不愉快。然而,NetBeans開發小組從版本5.0開始,對整個IDE作了大幅度的調整,並且在NetBeans 5.5中全面結合進JDK 1.6,從而提供了一種無可爭辯的優秀的用戶體驗,特別是運行於Windows平台上時(Linux平台版本仍然存在一些UI小問題,這估計要在NetBeans 6.0中得到全面糾正。特別是,版本5.5缺乏對於本地GTK外觀的支持)。
首先,NetBeans窗口系統的設計相當高級和靈活,開發人員可以非常容易地以配置方式實現停靠、隱藏和切換幾乎任何面板/編輯器。我還發現其菜單布局極具邏輯性而且易於使用,你可以很容易地存取大多數常用功能(例如,維護用戶庫)。一直以來,其整體穩定性和性能都是相當優秀的。
其次,基本Java編輯器的設計也非常不錯,盡管還不算最好(特別是,在代碼自動完成方面與其它IDE相比還有些慢),但是完全可以使用。此外,它的編輯器還提供了一組基本的重構功能(特別是,最常用的重命名/移動特征),盡管在我的測試中,我發現它並不總是上下文感知的—例如,在重命名Struts工程中的一個行為類相應的包時,struts-config.xml文件中相應的入口就不會更新(但是,在重構JSF支持bean和更新它們在faces-config.xml中的入口以及J2EE 1.4會話bean和它們在ejb-jar.xml中的入口等許多方面都表現得相當不錯)。
Swing開發
NetBeans最值得稱道的就是其著名的新開發的Matisse GUI設計器,這個工具基於新的GroupLayout布局管理器(它最初是由NetBeans開發小組自己開發的—在納入到基本JDK前作為一個擴展開發)構建。由於采用了基於基線型設計技術(即是,基於一個控件中實際文本的位置自動地對齊控件),所以,創建具有專業外觀的UI變得相當容易。事實上,其強有力的縮放和停靠功能使之成為我所見過的運行於任何平台上任何語言中最棒的UI設計器。
在安裝5.5版本之後,我還下載了最新的更新包—該包支持從未來的6.0發行版本逆向移植到當前的5.5版本。其中提供了一些極具生產效率的特征,例如自動國際化以及使用定制表單/面板(只要在你的工程內至少成功地編譯它們一次)的功能。Matisse就是NetBeans團隊所具開發水平的一個極為優秀的例證(圖1展示了實戰中的Matisse)。
圖1:Matisse及其定制的JPanel組件
對於Swing開發者來說,使用NetBeans的另外一個優點是,他們能夠使用它提供的強有力的RCP(豐富的客戶端平台)向導來創建新的復雜的Swing應用程序。考慮到Eclipse的基於SWT的RCP的流行性,NetBeans開發小組竭盡全力開發出一種相當可行的基於Swing的選擇方案,並且,恕我直言,其效果給人留下極為深刻的印象(盡管對於小型工程開發而言,初始學習時可能要費些勁)。
JSP/Struts開發
此外,NetBeans中還提供了一個很好的JSP編輯器—它提供了我們期望的所有基本特征以及所有的基本向導,並且為我們免除了啟動一個新的Struts工程相關細節設置的麻煩。由於加入了一個嵌入式Tomcat容器,開發以及測試JSP應用軟件變得特別容易和迅速。圖2展示了NetBeans web應用程序向導。
圖2:NetBeans Web應用程序向導
這個NetBeans web應用程序向導能夠自動地配置web.xml和struts-config.xml文件,並且能夠添加對於Tiles和Validator的支持。此外,這個向導還能夠針對文件struts-config.xml提供一些上下文菜單選項,甚至還包含添加ActionForms,Actions和Forwards等內容的子向導。但是,它沒有提供任何可視化編輯器以便用於展示應用程序中的頁面導航,並且也沒有針對Tiles和Validators配置提供任何額外支持。
作為個人觀點,我發現5.5版本中對於Struts的支持也相當體面,但是顯然還不如Matisse所實現的那樣流暢。此外,它也沒有提供針對JSP或HTML頁面的可視化編輯器(這對於老手決不是一個問題,但對於更多的初級程序員卻是一個良好的特征)。而且,這個版本中也缺乏在JSP編輯器中對於適當的嵌入式JavaScript的支持,而僅僅提供了一個基本的CSS編輯器(盡管在安裝Visual Web Pack後效果會稍好一些)。因此,所有這些方面都需要作進一步改進(圖3展示了NetBeans對Struts框架提供支持的一個示例)。
圖3:NetBeans對Struts的支持
JavaServer Faces開發
NetBeans對JSF的支持非常類似於它對Struts的支持。為此,它提供了一個向導,從而可以得到一個基本的工程框架,其中包括所需要的庫、配置所有要求的文件,甚至在其JSP編輯器中還提供了針對支持bean屬性的代碼自動完成功能;另外,還提供了一些向導用於簡化文件faces-config.xml中的導航規則。此外,NetBeans並沒有提供對Apache MyFaces的支持(僅支持JSF RI);因此,你必須手工修改創建的初始工程以便刪除JSF RI部分而使用MyFaces。
此外,NetBeans並沒有提供任何可視化編輯器來維護faces-config.xml文件。任何事情都是通過原始的XML編輯或兩三個基本上下文菜單向導來實現的。盡管這完全可以工作而且毫無疑問對於老手已經足夠了,但是,它幾乎無法實現其它IDE對於JSF開發者支持方面所具有的易用性和高效性。
然而,NetBeans Visual WebPack的確對構建JSF應用程序提供了一種可選方案—通過把Sun Java Studio Creator中的大多數特征直接移植到NetBeans中。這包括一個Matisse風格的web頁面GUI構建器,其中提供了大量的JSF控件(最近作為單獨的開源工程Woodstock而存在);這些控件擴展了基本JSF RI集,而且還支持數據綁定(既支持直接的數據庫查詢,也支持經由JPA/Hibernate的數據庫操作)。
雖然存在上面這麼多優秀的特征,但Visual Web Pack仍然存在一些不足(導致許多Java公司不願意選擇它),列舉如下:
1.缺乏對頁面模板的支持(盡管你可以把一個頁面保存為一個模板,並且把它用作新模板的一個基模板,但是顯然這種改變也無法從根本上簡化頁面的設計)。不過,對Facelets的支持或對來自於MyFaces的Tiles支持可以在此大派用場了。
2.缺乏對Apache MyFaces的支持(當發布到使用MyFaces RI而不是使用Sun的實現方案—例如JBoss—的應用程序服務器上時,這潛在地會導致一些問題)。
3.對於支持bean的自動生成功能不夠靈活(它基本上以一種非常直接的ASP.NET方式模仿了每一個JSF頁面中的結構化上下文,從而使之無法與面向會話的支持bean(例如JBoss Seam中所要求的)聯用。
【注意】一個偉大的特征是針對Facelets的支持。如今,許多JSF社區都在全力推薦用之作為JSP的完全替代品(特別是,JBoss Seam開發團隊在它所有的文檔中公開地呼吁這一點)。
盡管NetBeans開發小組聲稱在下一個發行版本中將盡力克服所有上面這些不足,但我仍認為Visual Web Pack是針對JSF開發的極具有生產效率的工具。
企業開發
NetBeans 5.5是第一個支持JPA和EJB 3.0的IDE,並且對之提供了相當優秀的支持。特別是,帶有注解(包括對persistence.xml文件的適當設置,甚至還提供一些基本的連接信息)的JPA實體類的自動生成功能將會節約你大量的重復編碼時間。而且,自動生成的JPA代碼是高質量的,可以立即投入使用。
對於純粹的企業開發方面,NetBeans對J2EE 1.4和Java EE 5提供了全面支持。特別是,對於J2EE 1.4工程,相應的EJB向導能夠生成所有要求的代碼(包括business/home/remote接口,以及它們各自的代理實現—更不必提綁定ejb-jar.xml配置文件這樣簡單的事情)。簡言之,NetBeans能夠自動為你處理J2EE 1.4相關的大多數瑣碎工作,而且也為Java EE 5提供良好的支持(是提供這種支持的第一個IDE,盡管IDEA隨後也很快提供了相應支持)。
從其消極的一面看,NetBeans僅對把企業應用程序發布到GlassFish/Sun應用程序服務器和JBoss上提供正式支持。盡管如此,其更新站點也為WebLogic和WebSphere提供了額外的支持插件,但是我還不十分確定是否NetBeans開發小組會正式提供對它們的支持。
另外,免費版本的企業包中還增添了強有力的UML圖表特征(包括雙向編輯以及與Java代碼的同步),而且還提供了BPEL/SOA編輯器。然而,對這些內容的討論已經超出本文范圍。
對NetBeans的建議
說實在的,我確實很喜歡使用NetBeans。它的幾近失敗的開發團隊奮力抗爭,終於爭得了屬於自己的一席一地—而當時幾乎每個人都會認為Eclipse會生吞活剝之,而如今它卻在自己的最新發行版本中實現了如此之多令人驚訝的特征(並且在後面的NetBeans 6.0將增添更多的內容)。然而,它只是沒有擁有像Eclipse那麼龐大的社團支持。不過,當涉及有關對於其它現成框架—例如Google Web Toolkit,JBoss Seam,Jasper Report,Spring,Tapestry,XDoclet,Echo2,Apache MyFaces,等等—的支持方面時,這難免會貶低該產品的聲譽。
IBM所做的一件相當明智的事情是,他果斷地放棄了對於Eclipse的控制權並創建一個相應的Eclipse基金會,這一舉措一下吸引了大量的第三方開發者。也許如今到了Sun應該放棄它對NetBeans的牢牢控制並且也該創建一個相應的NetBeans基金會的時候了。在這一點上,Eclipse並沒有比NetBeans更多的優勢(坦率地說,較之於Eclipse,我認為NetBeans看起來更象一個本地Windows應用程序—暫拋開所有Swing與SWT之爭不提的話)。總之,要想成為最優秀的Java IDE,NetBeans還需要大量的資源支持。因此,我認為光靠Sun自己恐怕很難實現這樣的野心。