1.
IOC Container: Spring, Guice
我們需要IOC Container的依賴注入作爲膠水,把其他工具包粘在一起。還需要它的AOP,進行事務配置,權限管理。
這麼多人都在使用Spring,實際使用中可以獲得巨大的便利,如果選擇了其他平臺就要面臨在關鍵時刻自己造輪子的窘境。使用Spring的實際經驗更長,方便與其他組件整合。
Guice是由Google出品的,又使用了JDK5中的註解功能,問題是以後是否能得到很好的支持。
2.
MVC: struts2, struts, JSF, RESTful Framework, SpringMVC
struts2比struts好用,在瞭解了OGNL的用法後,還是比較方便的。
struts畢竟還是老掉牙了。
JSF好複雜,沒有IDE的支持基本沒法用,看不清方向。
RESTfull Framework感覺太草率,有前途嗎。
springmvc現在默認不包含在spring包中了,它的功能太簡陋,有些新功能華而不實。
3.
ORM: Hibernate, JPA, iBatis, JDBC
作爲ORM方案,使用hibernate3對JPA的支持,使用annotation簡化配置。
Hibernate用起來比較熟,支持多數據庫,簡化了數據庫的操作,目前把所有調優的希望都放在二級緩存上了。
JPA對於規範不太瞭解。
iBatis據稱是對JDBC的最簡封裝,但是與hibernate有太多的區別。
JDBC根本沒進行封裝,用起來風險太高。使用封裝的框架更容易統一開發。
4.
View: JSP-2.0, Freemarker, Velocity
嚴重偏向Freemarker,易用性,擴展性,自定義宏,還可以用在不支持JSP-2.0的服務器上,而且還可以與struts2配合。可是Freemarker並沒有合適IDE配合,而且能夠熟練使用的程序員也不多。
JSP-2.0功能明顯不足,限制太多,不容易擴展,必須和taglib配合才能對付實際中的工作,taglib又太難寫。
Velocity功能不如Freemarker。
5.
Security: Spring Security, jsecurity, struts menu
Spring Security作爲acegi的升級版本,更易用了,與spring整合在一起,控制權限。
jsecurity作爲apache孵化器裏的項目,有人對它進行了強烈推薦。
是否還考慮基於struts menu寫一套自定義的菜單?
6.
Ajax Widgets: ExtJS, Dojo, YUI, JQuery-UI
ExtJS輕便,好用,漂亮,功能強大。只是協議有問題。
Dojo笨重,難看,都不知道怎麼用。
YUI是ExtJS的原型,但是封裝沒有ExtJS好。
JQuery-UI還很青澀。
如果不使用上述這類統一組件庫,還可以選擇jsCalendar這個日期選擇組件,FckEditor和Tiny_mce都是富文本編輯器。據說專業人士喜歡用FckEditor,喜歡漂亮的都喜歡用Tiny_mce。JavaScriptTemplate可以批量生成HTML。和DWR結合實現上傳進度條等功能。
7.
JS Function Lib: Prototypejs, JQuery, Mootools
Prototypejs最老。對應的擴展主要有Script.Aculo.us。
JQuery有強力的查詢能力。對應的擴展容易找到。
Mootools被fin強烈推薦,說OO封裝做得很好,但感覺擴展組件不豐富。
8.
JSON: DWR, json-lib
使用dwr和 commmons-fileupload製作上傳文件的進度條。
考慮使用dwr-2的服務器推,製作在線聊天。
與服務器之間交互採用json格式傳遞數據,目前採用的json-lib在處理循環引用的時候需要特別設置,否則在處理hibernate雙向關聯的時候100%出錯。
二. 擴展架構
在基礎架構上進行的擴展,實現特定功能的工具:
1.
WebService: CXF, XFire, Axis-2
Axis-2總感覺很笨重,而且不容易和Spring結合。
XFire已經停止開發,後來與Celtix合併爲apache中的新項目CXF。
CXF是由Objectweb Celtix和Codehaus XFire合併成立的。與Axis1~2比較,更易於整合到Spring中。而且據說支持JAX-WS。不過不知道JAX-WS是幹啥的。
2.
工作流: Jbpm-3, Jbpm-4, Osworkflow
Jbpm-3是開源中比較火的框架了。但是spring-module-jbpm31封裝的有問題,單元測試會報異常。
Jbpm-4太新,還是alpha版,而且改動太大了。
Osworkflow,號稱最靈活的工作流引擎,據說所有實現都要自己寫代碼。
兩者都支持Hibernate。
3.
規則引擎: drools
據說是很輕量級的,擁有平民語法的規則引擎。
4.
Search Engine: Hibernate-search, Compass, Lucence
Compass同另外一個Hibernate-search都是基於Lucence,對數據庫的全文搜索引擎。
Compass開發的時間更長一些。Hibernate-search出現的時間還比較短,會用的人少,不知道前途如何。如果兩者都不符合,還要考慮自己直接操作Lucence。
之前使用過Compass,在單元測試的時候會出現內存溢出的問題。
5.
報表: JasperReport, BIRT, 自定義
JasperReport負責文本報表,JFreeChat圖形報表。
雖然沒使用過JasperReport,但已經聽到過太多其他人對它的怨言了。
BIRT沒有想像中那樣好用,依賴那些eclipse中的包,顯得太大了。
因爲東西方習慣差異,自定義屬於自己的一套報表應該可以解決國內很多問題。首選答案竟然是手寫PDF和JFreeChat結合生成圖表。
6.
JMS: ActiveMQ, Jencks, Lingo
ActiveMQ是很多人推薦使用的JMS框架。
Jencks是一個JCA平臺,可以提供J2EE裏的資源容器。
Lingo據說可以把JMS封裝成POJO。
7.
定時調度: Quartz, java.util.Timer
據說Quartz是唯一免費的解決方式。這個組件放到web.xml裏,可能造成內存泄露。robbin認爲這種定時任務不應該和項目綁定在一起,而是應該建立一個單獨的任務服務器。
如果是簡單功能,也可以用JDK自帶的Timer。
8.
Cluster Cache: Open Terracotta
被許多公司使用,據說是很強大的分佈集羣策略。
9.
JMX: Spring封裝,MX4j
Java管理擴展,給人的感覺像是RMI一類的遠程調用。
10.
OSGI: equinox, felix
有點兒反感equinox的笨重,而且equinox是否能和eclipse分離呢?能否獨立使用呢?能否能嵌入自己的項目呢?
felix是apache的項目,而且有maven插件,但是看了源代碼之後,感覺太不成熟了。
11.
動態語言: bsh, groovy, jruby, jython, rhino
bsh最簡單,而且都是java語法,功能也不多。
rhino只是解析js,也沒什麼特別功能。
groovy被期許了很大的希望,受到多方支持,有爲數不少的組件,值得考慮一下。
jruby和jython的話,語法和java相差太大了,基本等於再學一門語言。
三. 開發環境
1.
JDK: 5.0, 1.4, 6.0
5.0的那些特性還是很好用的,而且可以使用Retrotranslator把5.0編譯的class轉換成可以在1.4下運行的class。
推薦使用JRockit-27.2,據說可以解決sun jdk的perm gen內存不足問題。
6.0有點兒新了,怕出問題。
2.
Servlet Container: Tomcat-5.5, Weblogic-9/10, Jboss, Geromino, Tomcat-6.0, Glassfish, Jetty, Resin
一般人還是用Tomcat-5.5,據說Tomcat-6.0支持OSGI了而且運行方式跟之前都不同了。
Jetty還是用在集成測試中。
之後的迭代裏,應該兼容Weblogic, Jboss, Geromino, Glassfish。
3.
數據庫: Hsqldb, Mysql, H2database, Derby, Oracle, SQLServer
採用hsqldb作爲嵌入式數據庫,可與工程綁定發佈,用戶下載體驗版後不需要額外安裝數據庫,減少了配置出錯的機會。
考慮H2database和Derby,似乎H2功能更強力,Derby出身名門但是不支持commit是個問題。
Mysql是必須要支持的,因爲是免費中使用特別廣的。
SQLServer也是國內很多地方使用的中型數據庫。
Oracle有很多人迷信,的確也是非常常用的大型數據庫。
Hibernate本身支持多數據庫,包括Mysql, SQLServer, Oracle等,未來替換成企業數據庫也不是問題。
四. 測試工具
1.
單元測試: JUnit-3, JUnit-4, TestNG
JUnit-3。經典單元測試工具,應用很廣,基本所有工具都支持。
JUnit-4有點兒新,新功能不太清楚。
TestNG據說很厲害,但不太熟悉。
js的單元測試工具 jsunit不知如何應用。
2.
Mock: EasyMock, JMock, Spring-test
EasyMock是老牌了,不需要繼承特定的超類。
JMock需要繼承特定超類,屬於新框架。
Spring-test裏提供了很多對付servlet裏接口的測試類。它還提供了許多常用的測試基類,可以緩存xml配置並支持事務。
3.
測試覆蓋率: Cobertura, Clover
Cobertura發展至今,界面和功能已經接近Clover了,開源並且沒有古怪的協議約束,Maven2上的配置也比Clover更簡便。
4.
Web集成測試: Selenium
Selenium是一款被衆口稱讚的集成測試工具,使用Firefox的插件錄製測試,然後可以翻譯成多種平臺語言進行自動化測試。
同類產品還有httpunit和jwebunit。DBUnit可以幫助維護數據庫中測試數據的完整,但是無法處理表間雙向外鍵的情況。
可以使用Maven2插件進行測試,但是問題是一直沒有發佈1.0,一直只能使用1.0-SNAPSHOT。
5.
WebService測試: SOAPUI
據說是唯一的WebService測試工具。
6.
壓力測試: JMeter
JMeter聽過但是沒用過。
五. 項目管理
1.
UML: Enterprise Architecture, Rose 2003, Visio, StarUML
EA不是免費的。
Rose是名門。
Visio是畫圖挺方便。
StarUML是免費開源方案。
2.
項目部署工具: Maven2, Ant
Ant更靈活,但是對於大規模項目,自己寫build.xml再配置所有的插件和各種流程太麻煩了。而且要藉助ivy纔好管理依賴。
Maven2擁有規範的目錄結構和流程體系,擁有更易用的插件,還可以統一管理jar依賴,它支持多種插件,進行自動打包,測試,代碼分析,生成報表。。問題是從外網下載依賴的時候受網速影響太大,一旦遇到外網缺失的依賴更是無可奈何,必須搭建內部repo。Maven2的一個問題,在於不知道如何把這麼巨大的一個xml文件拆分成多個可以複用的模塊。所以也只好採用這種parent的繼承關係對所有的依賴和插件進行管理。
3.
持續集成: CruiseControl, Hudson
cc是老牌勁旅,但是界面也太難看了。
Hudson是日本人寫的,界面漂亮,所有配置都可以直接通過界面配置。
4.
代碼規範: Jalopy, checkstyle
Jalopy用來美化代碼,sf.net上的開源項目已經好多年沒有更新了,最新的jalopy已經變成了收費的商業項目。不過我們使用幾年前的免費項目就足夠了。
把Checkstyle的規範與Jalopy的美化規範調節一致,就可以放心編寫代碼了。
5.
代碼檢測: PMD, Findbugs, JavaNCSS, Taglist, Jdepend
PMD, CPD幫助我們檢測無用的代碼和重複的代碼。
Findbugs檢測代碼中的缺陷。
JavaNCSS計算有效代碼行數。
Taglist統計代碼中的特定標記。
Jdepend用於統計包之間的依賴性。
6.
版本控制,缺陷跟蹤和WIKI: SVN, JIRA, Confluence
Subversion作爲版本控制工具,JIRA作爲缺陷管理,Confluence提供資源庫平臺。
7.
數據庫版本控制: DBDeploy
DBDeploy讓數據庫腳本也可以實現版本控制。咱們基於dbdeploy擴展的dbside,可以提供db:migrate, db:rollback, db:view等功能。
使用Hibernate-tools從數據庫反向生成領域模型。
8.
Web服務器控制: Cargo
據說可以統一控制各種Web服務器,比如Tomcat, Jboss, Weblogic
六. 雜項
1.
JDK-5.0
2.
公共Utils工具類。
3.
日誌。
4.
緩存。
5.
JavaMail。
6.
UTF-8與國際化。
7.
異常處理。