java項目技術選擇方案

. 基礎架構 

   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.

      異常處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章