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