原文轉載至:https://blog.csdn.net/mxmxz/article/details/73043156
上周接到個新任務,一個遺留的接口工程需要改造,然而根據前任開發留下的文檔看,這個工程沒有代碼,只有生產環境的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包還原出工程源碼相比,都是小問題了!