米揚(yáng)
[摘 ? ?要] 針對某公司已建業(yè)務(wù)系統(tǒng)源碼不全,原開發(fā)公司和人員均不維護(hù),但此公司又亟需使用此系統(tǒng)的局面,通過相關(guān)分析和技術(shù)獲得源碼,最終成功改造升級系統(tǒng)并解決相關(guān)業(yè)務(wù)問題,讓其公司的業(yè)務(wù)效率得到進(jìn)一步提升。
[關(guān)鍵詞] J2EE;源代碼;反編譯;web開發(fā);Eclipse;遺留系統(tǒng)
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2020. 19. 075
[中圖分類號] TP315 ? ?[文獻(xiàn)標(biāo)識碼] ?A ? ? ?[文章編號] ?1673 - 0194(2020)19- 0184- 02
0 ? ? ?引 ? ?言
源碼是系統(tǒng)開發(fā)的重要基石,在較多的信息工程項(xiàng)目中,業(yè)務(wù)方往往僅重視其代碼入檔,但入檔代碼能否運(yùn)行并沒有去驗(yàn)證,一旦承擔(dān)此項(xiàng)目的開發(fā)公司由于經(jīng)營等原因不再進(jìn)行保障,此時(shí)再拿出驗(yàn)收時(shí)的源代碼才發(fā)現(xiàn)運(yùn)行不起,給業(yè)務(wù)方造成較大損失。當(dāng)源碼無法運(yùn)行的情況已經(jīng)發(fā)生時(shí),多數(shù)接手的開發(fā)公司會選擇重新建設(shè)一套新的代碼來替換現(xiàn)有系統(tǒng),但處于系統(tǒng)部分功能還能使用,業(yè)務(wù)方不允許重建,加之系統(tǒng)本身又存在諸多bug,卻要求較短時(shí)間解決的多種困難境地情況時(shí),一味地重新開發(fā)就顯得不現(xiàn)實(shí),對于這種遺留系統(tǒng)[1],文章不涉及具體的代碼編寫,主要是通過分析和相關(guān)技術(shù)來闡述遇到此種情況的系統(tǒng)升級改造的一種解決思路和方式方法。
1 ? ? ?系統(tǒng)現(xiàn)狀分析
改造升級任何系統(tǒng)前,首先需對系統(tǒng)處于的現(xiàn)狀進(jìn)行一次全面問診工作。主要從硬件環(huán)境、網(wǎng)絡(luò)環(huán)境、軟件環(huán)境、系統(tǒng)數(shù)據(jù)、軟件操作,最后到業(yè)務(wù)熟悉度六個層面進(jìn)行摸底。
(1)硬件環(huán)境
系統(tǒng)是部署在物理服務(wù)器還是虛擬服務(wù)器上?配置情況怎樣?筆者主持的系統(tǒng)是部署在某公司的Vmware虛擬化平臺提供的系統(tǒng)計(jì)算、存儲服務(wù)。
(2)網(wǎng)絡(luò)環(huán)境
網(wǎng)絡(luò)環(huán)境主要查看是外網(wǎng)還是公司內(nèi)網(wǎng),獨(dú)立IP地址還是NAT轉(zhuǎn)換的內(nèi)網(wǎng)地址?網(wǎng)絡(luò)連通性、延遲性怎樣?特別是網(wǎng)速會在一定程度上影響用戶體驗(yàn),需重點(diǎn)診斷。此系統(tǒng)的網(wǎng)絡(luò)接入為虛擬網(wǎng)絡(luò)架構(gòu)下的IP,千兆內(nèi)網(wǎng)環(huán)境,與其下屬單位網(wǎng)絡(luò)連通狀況良好,延遲性不高,還要包括CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)配置和使用情況。
(3)軟件環(huán)境
軟件環(huán)境主要從運(yùn)行架構(gòu)、技術(shù)體系、數(shù)據(jù)庫、應(yīng)用服務(wù)器、操作系統(tǒng)進(jìn)行分析。筆者尋找出.class和.jar的后綴文件,可知采用的Java語言開發(fā),同時(shí)啟動命令和Main文件反編譯。接著從WEB-INF/conf文件夾下的配置文件和WEB-INF/lib下的jar文件進(jìn)一步分析,在配置文件中找出數(shù)據(jù)庫配置文件和jar文件解壓后的文件結(jié)構(gòu)。
綜合分析可知采用了B/S運(yùn)行架構(gòu)、J2EE技術(shù)體系開發(fā)[2]、Postgresql數(shù)據(jù)庫、CentOS操作系統(tǒng)。
(4)系統(tǒng)數(shù)據(jù)
系統(tǒng)存儲的數(shù)據(jù)一般有2大類數(shù)據(jù)。一為結(jié)構(gòu)化,使用數(shù)據(jù)庫方式存儲業(yè)務(wù)信息數(shù)據(jù)。二為系統(tǒng)業(yè)務(wù)信息所附帶非結(jié)構(gòu)化的附件數(shù)據(jù),主要包括合同管理、制度管理、HSE管理等非結(jié)構(gòu)化文件數(shù)據(jù)。其中,可進(jìn)入數(shù)據(jù)庫查看相關(guān)表并初步分析其關(guān)系,詳細(xì)關(guān)系還需從源代碼進(jìn)行分析。
(5)軟件操作和業(yè)務(wù)熟悉
軟件操作主要是了解到系統(tǒng)目前主要功能,發(fā)現(xiàn)與業(yè)務(wù)的對應(yīng)關(guān)系。筆者的系統(tǒng)為一套整體開發(fā)的業(yè)務(wù)應(yīng)用系統(tǒng),合同、新聞、資金、HSE、投資計(jì)劃等作為子系統(tǒng)涵蓋在經(jīng)營管理系統(tǒng)中。
最后,業(yè)務(wù)熟悉是在對軟件操作及前面提及的問題熟悉基礎(chǔ)上,再與用戶進(jìn)行系統(tǒng)使用感受和業(yè)務(wù)需求的調(diào)研分析,主要包括系統(tǒng)使用中遇到的問題和需提升的地方,以及系統(tǒng)用戶量和各下屬單位是否有自己獨(dú)立的需求。
2 ? ? ?邏輯實(shí)現(xiàn)關(guān)系和反編譯工具
2.1 ? 邏輯實(shí)現(xiàn)關(guān)系
J2EE是Java企業(yè)版,它的核心是一組技術(shù)規(guī)范與指南,提供基于組件的方式來設(shè)計(jì)、開發(fā)、組裝和部署企業(yè)應(yīng)用。此種架構(gòu)的系統(tǒng)代碼實(shí)現(xiàn)關(guān)系[3]如下:web頁面(JSP+HTML)到Action到Service到DAO接口到DAO IMPL實(shí)現(xiàn)到數(shù)據(jù)庫,其中model對應(yīng)數(shù)據(jù)庫表的實(shí)體類,暫時(shí)存儲數(shù)據(jù)方便持久化,在server中往往會獲取相應(yīng)數(shù)據(jù)。正如“Action服務(wù)生,點(diǎn)什么菜,菜上給幾號桌,都是它的任務(wù);Service廚師,action送來的菜單上的菜全是它做的;Dao小工和原材料(數(shù)據(jù)庫)打交道事情全是它管。”
2.2 ? 反編譯工具[4]
反編譯是一個對可執(zhí)行文件進(jìn)行逆向分析,從而得到源代碼的過程。Java這樣運(yùn)行在虛擬機(jī)上的編程語言,比較容易進(jìn)行反編譯。目前Java比較成熟的反編譯工具:(1)JD;(2)procyon-decompiler;(3)luyten;(4)Jadx。這些都會遇到反編譯錯誤的現(xiàn)象,需結(jié)合使用。Java多數(shù)直接放class文件或者打包在jar里面,此系統(tǒng)是直接打包在jar中,筆者使用的JD工具,先使用JD-GUI進(jìn)行大批class文件反編譯,JD-GUI能從jar中生成相應(yīng)的文件夾結(jié)構(gòu),之后使用JD-Eclipse進(jìn)行輔助,最終在Eclipse中構(gòu)建出項(xiàng)目結(jié)構(gòu)。
3 ? ? ?開發(fā)環(huán)境部署
3.1 ? 安裝數(shù)據(jù)庫
此系統(tǒng)使用的PostgreSQL數(shù)據(jù)庫[5],為開源的對象關(guān)系數(shù)據(jù)庫。筆者本機(jī)為Mac操作系統(tǒng),使用homebrew來安裝。(1)安裝:brew install postgresql ;(2)啟動:pg_ctl start;(3)創(chuàng)建postgres用戶: create user postgres with password 'XXXXXX';(4)安裝pgAdmin:直接從官網(wǎng)下載安裝,pgAdmin是PostgreSQL數(shù)據(jù)庫的界面管理工具 ,創(chuàng)建數(shù)據(jù)庫使用其進(jìn)行;(5)服務(wù)器備份數(shù)據(jù)庫:pg_dump -U postgres -F t -f /數(shù)據(jù)庫.tar 數(shù)據(jù)庫;(6)本機(jī)恢復(fù)數(shù)據(jù)庫:pg_restore -U postgres -d 數(shù)據(jù)庫 /數(shù)據(jù)庫.tar。
3.2 ? 構(gòu)建工程目錄
通過Eclipse建立java project。在src目錄中存放反編譯的java源文件,主要包含各子系統(tǒng)action、model、server、dao各種類、接口等文件;Reference Libraries目錄存放工程里面引入的Jar包;JRE System Library目錄表示引入Java版本的運(yùn)行環(huán)境;data目錄存放附件數(shù)據(jù);www目錄是視圖和項(xiàng)目配置的核心,存放各子系統(tǒng)的jsp、html等視圖文件,其中在WEB-INF目錄建立著conf、xml等配置文件,以及編譯后的classes文件。這樣工程目錄的設(shè)計(jì)清楚,各子系統(tǒng)的功能區(qū)明確,使用此框架進(jìn)行開發(fā)時(shí),可以根據(jù)自己負(fù)責(zé)的功能對其進(jìn)行擴(kuò)展和完善,即可高效開發(fā)。
3.3 ? 啟動應(yīng)用
在Eclipse中可配置Java Application 使用Main類運(yùn)行系統(tǒng),成功啟動應(yīng)用信息在瀏覽器中輸入:0.0.0.0:8888進(jìn)行訪問,訪問結(jié)果出現(xiàn)登錄頁面表示應(yīng)用成功通過瀏覽器被用戶訪問。
4 ? ? ?實(shí)用案例
在已搭建好的開發(fā)環(huán)境中,通過對資金管理子系統(tǒng)中對外支付功能的刪除功能改造為作廢功能做一個簡介,說明下主要升級改造思路:(1)啟動應(yīng)用;(2)打開對外支付功能網(wǎng)頁;(3)用sublime全文搜索定位:啟動應(yīng)用之后,打開對外支付頁面,分析作廢功能可以沿用的頁面,如對外支付申請錄入,復(fù)制“對外支付申請錄入”字樣,通過sublime選擇查找在文件查找進(jìn)行全文搜索來快速定位源碼位置;(4)打開定位文件并編寫目錄文件:在定位的源碼位置處添加代碼;(5)編寫js和html視圖文件:通過視圖文件引用action代碼;(6)編寫action源碼文件;(7)編寫model源碼文件;(8)編寫server源碼文件;(9)編寫dao和dao impl源碼文件;(10)重新編譯運(yùn)行;(11)發(fā)布至生產(chǎn)環(huán)境:在本機(jī)開發(fā)測試成功后,需要把編譯過的class文件使用jar uvf命令重新打包成jar文件替換到生產(chǎn)服務(wù)器中jar文件,同時(shí)替換修改的視圖文件并重新運(yùn)行服務(wù)。
5 ? ? ?結(jié) ? ?語
文章闡述了已建系統(tǒng)但源碼不能運(yùn)行,亟需改造升級相關(guān)功能并解決bug來保障系統(tǒng)業(yè)務(wù)的正常運(yùn)行,通過相關(guān)分析技術(shù)思路、方法和工具的配套使用,成功復(fù)原了基于J2EE的某公司遺留系統(tǒng)源碼和開發(fā)環(huán)境并實(shí)現(xiàn)新功能開發(fā)的相關(guān)過程。實(shí)際的項(xiàng)目中時(shí)常會發(fā)生對待遺留系統(tǒng)的問題,那么筆者希望通過此實(shí)際項(xiàng)目的解決之道,不光能為Java方面的項(xiàng)目提供參考,也能為解決相類似問題提供一個可借鑒的新方法,對軟件公司和開發(fā)人員具有一定的實(shí)用價(jià)值。
主要參考文獻(xiàn)
[1]Chris Birchall.遺留系統(tǒng)重建實(shí)戰(zhàn)[M].張喻,張耀丹,禚嫻靜,譯.北京:人民郵電出版社,2017.
[2]黑馬程序員.Java EE企業(yè)級應(yīng)用開發(fā)教程(Spring+Spring MVC+MyBatis)[M].北京:人民郵電出版社,2017.
[3]李興華. Java Web開發(fā)實(shí)戰(zhàn)經(jīng)典基礎(chǔ)篇(JSP、Servlet、Struts、Ajax)[M].北京:清華大學(xué)出版社,2010.
[4]趙榮彩.反編譯技術(shù)與軟件逆向分析[M].北京:國防工業(yè)出版社,2010.
[5]Regina Obe, Leo Hsu.PostgreSQL即學(xué)即用[M].丁奇鵬,譯.北京:人民郵電出版社,2010.