從jar包還原出java原始碼(專案檔案)
上週接到個新任務,一個遺留的介面工程需要改造,然而根據前任開發留下的文件看,這個工程沒有程式碼,只有生產環境的jar包供使用。。邊吐(咒)槽(罵)邊在SVN伺服器上四處翻找,想找到這個工程的原始碼,畢竟沒原始碼怎麼跑起來這個工程?不能跑起來怎麼改造除錯?
確認真的找不到原始碼之後。。冷靜下來開始研究這個前輩留下的坑
0. get jar包
從生產環境down下來jar包,開啟看了一眼:
黑人問號臉。。這是啥?為什麼jar包裡面還有java檔案?還有這種操作?
1. 初次嘗試
把jar包的內容解壓出來之後,就想把所有的class檔案刪掉,只留下java檔案,這樣不就get了原始碼?
結果發現想的太簡單了,從上面的截圖就能看出,class檔案在2010年的5月25號有更新,而java檔案是2010年3月31號更新的,這就說明class檔案比java檔案更新,所以這些java檔案都是過期的。。【坑啊
2. 再次嘗試
如果只有一個class檔案,怎麼檢視java程式碼這個很簡單,平時用JD-GUI或類似的反編譯工具就可以了,但印象中只能一個檔案一個檔案的看,我手裡有一個jar包可怎麼還原原始碼導進MyEclipse啊。。
去google了半天,都沒有找到好的答案(事後發現了答案,和我的做法相同)
一陣沮喪,然後無聊打開了JD-GUI,開啟jar包後,隨手點到了左上角的File,咦??
發現了一個save!一陣興奮,然後點了儲存試了一下,發現匯出來的zip檔案就是反編譯後的整個原始碼!
3. 小問題
開啟zip檔案看了一眼,發現:
因為jar包裡面有同名的class檔案和java檔案,匯出來的反編譯原始碼也保留了舊的java檔案在裡面(從檔案時間可以看出)
4. 解決小問題
這裡用了壓縮軟體的命令,我平時用的是7-ZIP,簡單搜尋學習了一下,步驟如下:
a. 將7-ZIP的目錄配置到系統環境變數(PATH)中
b. 開啟命令列,到jar包所在目錄
c. 執行命令
7z d xxx.jar *.java -r
效果如圖:
5. 重新儲存原始碼
刪除了原jar包中的java檔案後,再次用JD-GUI儲存反編譯原始碼檔案,搞定
6. 最後
歡聲笑語中獲得了原始碼後,發現想啟動這個專案還有些小麻煩,不過跟不知道怎麼從jar包還原出工程原始碼相比,都是小問題了!