復雜的故事簡單說,復雜的問題簡單做,您好,這里是簡露一手,歡迎瀏覽。
簡述
每次:項目發布版本,所有人忐忑不安,出過太多次事故,項目模塊大,模塊多,模塊間緊密關聯,哪都會出問題。
一旦:不熟悉項目或新人加入項目或直接是新招的實習生,對于一個還沒有穩定的員工和一個不具備掌控整個代碼風險把控的員工,是否應該把整個項目SVN發給他?給他,項目安全和風險太大;不給,招來干嘛?怎開發?。
就算:自己運行項目,修改代碼時99%的代碼與自己無關,下載慢,加載慢,查找慢,編譯慢,慢慢慢慢慢。
最后:版本成了心頭大患,代碼沒人敢改,偉大了一堆熬夜測試的人。
分析
耦合性太強,牽一發而動全身。
- 項目模塊間關聯緊密,修改一個模塊影響整個項目。
- 缺少核心模塊和業務模塊的區分。
- 缺少對核心代碼的剝離和保護措施
處理的方式很多,這里就推薦一種簡單方式。將代碼分成核心包和業務包,建立類庫。
處理
從上面分析來看 關鍵點在于拆,其實隱藏的還有一個合。需產出一種效果:代碼開發時只需要拆分出來的一小部分代碼,而在應用調試和啟動運行的則是一個所有代碼編譯后的合集。簡單點就是一拆一合,分兩個步驟:拆、合。
拆
拆是指把整個項目按照一定的思維邏輯進行核心和業務拆分。這個一定的思維邏輯是說符合項目本身架構核心和業務核心,我們這里先用包來稱呼,后面好表述。最上層分為:核心包、業務包。核心包以外的部分作為業務包,核心包為一個或極少的幾包;而業務包是無限擴展的很多個包,如:新增一個日志查詢模塊,則建立日志業務包。這個業務包和核心包中間的關系,重點:業務包依賴于核心包,而核心包不依賴于任何業務包。到這里都是一個概念的表述,實際以Eclipse為例操作分三個步驟來做:建子項目、遷移代碼、解耦調整。
為方便講解,這里先創建了一個簡單的項目:georgekaren,主要業務是客戶端ClientSoap調用Server查詢Adsl、Cdma、User三個業務的業務信息,項目模塊:
建子項目
項目framework、db、util和server包的server對象放到核心包,業務包根據功能和業務邏輯拆分后包括:client包、cron包、log包、server包[分成Adsl業務擴展包、Cdma業務擴展包、User業務擴展包]、webservice包。針對每一個包建立一個子項目[如果業務包有Web依賴,則創建Web項目],如下。
這里不要嫌創建的項目多而覺得繁雜,創建項目時間比較短,合包后很方便。
遷移代碼
項目建立好之后就開始將原始項目中的代碼復制到新建的項目中去,遷移過去的代碼或多或少會由于依賴關系會有編譯報錯,留給后面步驟去處理。
解耦調整
代碼遷移完成后,需要做的就是修正編譯錯誤。主要有兩個手段,其一是給項目添加依賴引用,業務包除了對core的依賴盡量減少對其它包的依賴,可以適量修改代碼來完成;其二是調整core對所有業務包的依賴,使核心包不依賴業務包,并且不影響Client調用Server的業務。
- 項目添加引用,屬性設置Java Build Path。
- 調整core 的引用,采用loadClass方式來替代直接new 業務Server
實際生產用的時候大部分使用的工廠,這里就不去創建一個工廠了,直接貼loadClass,表述的原理一樣。
原
Old
新
這樣改造后core核心包的編譯不依賴Server業務包,通常有數據庫的情況下,將serverName和MethonName存到數據庫表中,由程序根據type自動從數據庫中查詢,這樣的處理有個詞叫插件;當一個客戶請求需要先查詢Adsl業務再加上Cdma或先查詢User再查詢Adsl場景時只需要更改數據庫配置的插件和插件的順序,就可以組成不同的業務場景,這在流程配置上,尤其有效。
合
合是指把整個項目拆分后在單獨開發或運行的時候怎么得到其它業務包的編譯文件,這個是一個合的過程。這里介紹的處理方式是:類庫,打包。
建類庫
建類庫是指建設一個存放公共jar或其它公共文件的地方,可以是個文件夾,可以是個項目,這里我們建立一個項目,并建立一個文件夾publib,將用于存放所有的包。
打包
打包時將所有核心、業務包編譯成class并打成jar包。這里使用Eclipse自帶的ant自動打包。操作:
-
業務包項目上右鍵--屬性--Export(導出)--Ant
導出
生成ant的build.xml文件,修改build.xml的兩處地方,1.第一行的default="build" 修改為 default="package";2.path 下面增加target來配置導出jar的路徑。
按照此方式將所有的業務包項目都配置ant,配置完成后再Build.xml上右鍵Run執行,jar就自動導出到類庫的publib下了。
到這里類庫就已經有了所有jar,所有的包全部合到了類庫中。
效果
回頭看下最初的問題:
- 發版本問題,只需要關注有業務改動的jar,沒有那么多動蕩,回退也相當的方便,替換修改的jar就完成了回退。
- 新人安全問題,如讓新人修改adsl業務的一個需求,只給予Adsl項目權限和pub項目的權限就OK了,核心代碼和其它模塊都是安全的。
- 代碼多,加載慢問題,修改cdma則只下載cdma代碼,業務包的代碼量極少,慢問題迎刃而解。
總結
拆分是手段,類庫打包是方法;原則是少代碼,多包,非核心少依賴。做成功了可以任意配置需要使用的業務包,按照不同數量和不同的順序串起來可以產生無限種業務功能。
<small>作為商業項目,完成后還需要一步,對核心代碼或關鍵業務包進行保密處理,而簡單又有效的方式就是混淆,如有意,請留言,根據情況找時間再補上混淆保密的文章</small>