使用jar包反編譯形成pom工程
這周接了一個(gè)需要吧把jar還原代碼新建pom項(xiàng)目的工作,一百多個(gè)jar還是挺累的,鼠標(biāo)用的都不靈敏了。當(dāng)然這只是量的問題,下面記錄一下具體的操作方法。
1. 反編譯jar得到源碼
1.1 使用jd-gui工具
這個(gè)不需要安裝,下載之后壓縮包里面有exe應(yīng)用程序。打開jd-gui.exe,先設(shè)置一下反編譯后不需要有注釋。點(diǎn)擊help -> preferences, 不要勾選write original line number 和write metadata

1.2 點(diǎn)擊file - > open file 選中需要反編譯的jar
或者直接把jar拖入到j(luò)d-gui的窗口。左邊是列舉包路徑和文件,右邊的窗口是顯示源代碼的

1.3 保存反編譯的源代碼
file -> save all source ,它會(huì)以zip的形式保存在本地計(jì)算機(jī)。
反編譯之后的源文件有些是正常的,有部分可能是需要人工修復(fù)一下代碼,比如反編譯后有g(shù)oto關(guān)鍵詞,super指向報(bào)錯(cuò)等問題??梢該Q其他的反編譯工具試試,再比對(duì)反編譯之后的差異進(jìn)行參考對(duì)其修復(fù)代碼。這里還介紹一個(gè)反編譯工具luyten,最新版本是0.0.5。其他的根據(jù)也很多,可以網(wǎng)上搜索。
如果同時(shí)使用不同的反編譯工具,建議以某一個(gè)為主,其他做輔助參考。因?yàn)椴煌姆淳幾g工具反編譯之后的代碼是有些差異的。比如變量名稱,gd-gui是反編譯是String str ,luyten 反編譯是 String name,當(dāng)然這個(gè)變量在整個(gè)類或者方法中都是一致的,不會(huì)報(bào)錯(cuò)關(guān)系不大,只是可閱讀性是否容易看懂源碼。格式上gd-gui會(huì)有很多斷行空行沒luyten整齊好閱讀。luyten 的反編譯速度沒jd-gui快(luyten點(diǎn)擊單個(gè)文件后右下角會(huì)顯示進(jìn)度條,100%時(shí)右邊窗口就顯示代碼了)
2. ideal新建pom工程
2.1 file ->new ->project
選擇maven選項(xiàng),project SDK如果是第一次使用ideal的選擇一下本機(jī)的jdk安裝目錄,點(diǎn)擊下一步

2.2 GroupId 和 ArtifactId 可以自定義填寫
建議都寫項(xiàng)目名稱,版本號(hào)自定義也可默認(rèn)不修改

2.3 項(xiàng)目名稱和項(xiàng)目文件保存路徑會(huì)自動(dòng)填入
(第一次使用ideal需要設(shè)置一下項(xiàng)目路徑)

2.4 新建好的項(xiàng)目結(jié)構(gòu)如下

3. 復(fù)制jar源碼到pom工程
3.1 解壓上面1.3那個(gè)步驟輸出的zip
只需要復(fù)制主要代碼到新pom項(xiàng)目下的src-main-java目錄下

若解壓后發(fā)現(xiàn)里面還有jar,說明你這個(gè)jar當(dāng)時(shí)創(chuàng)建的時(shí)候本來就用了別人的jar,那這些解壓后的jar在新建的pom工程肯定也是需要用上的,可以參考下面的3.2.1 步驟,也可以直接放在項(xiàng)目下和main-src-java 同一級(jí)目錄就行,然后選中這些jar右鍵 選as Library 構(gòu)建依賴。建議用下面3.2.1步驟的方案比較規(guī)范一些。
3.2 補(bǔ)充pom文件里面的配置
項(xiàng)目需要用到哪些jar都需要在此寫好(文章末尾附有參考pom.xml文件),以下只列舉了幾個(gè)公網(wǎng)上可以自動(dòng)下載到的jar。每次修改了pom文件后,右下角會(huì)出現(xiàn)彈框,點(diǎn)擊import changes才會(huì)刷新依賴,java文件里面才能引用到新加的架包

3.2.1 如果用到了自己封裝的jar,需要在本地倉庫(我的是安裝maven時(shí)默認(rèn)的C:\Users\Administrator.m2\repository)下新建文件夾放好jar,下圖圈出的三個(gè)分別是groupId、artifactId、version,可以自定義命名,最后文件夾下的架包命名是artifactId-version.jar(如下圖就是fastjson-1.2.6.jar)

pom里面配置如下
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.6</version>
</dependency>3.2.2 如果用到公司私服上的jar,需要在maven安裝目錄下的settings.xml文件里面配置私服的 地址/鏡像。
配置本地的maven倉庫地址
<localRepository>D:\my_mevan\repository</localRepository> # 自行修改本地地址
配置私服鏡像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/.../.../</url> # 填寫你的url
</mirror>3.2.3 如果別人給了整個(gè)倉庫給你,把倉庫復(fù)制到C:\Users\Administrator.m2\下即可,然后file->setting到下面這個(gè)界面,選擇別人給你的倉庫就不用自己本地的倉庫了。此處不建議把別人倉庫下的文件下合并到自己的repository下面,可能會(huì)有問題引用不到的喲

3.3 檢查源代碼
反編譯后有問題的代碼片段,根據(jù)代碼上下文進(jìn)行修復(fù)或者自己寫個(gè)與原來功能一致的代替。若遇道switch(字符串)有紅色波浪線時(shí)(jdk1.7版本才開始支持字符串類型),可以參考如下設(shè)置file->Project Structure

Modules-> Source->language level選 8開頭的這個(gè)(一般大于7開頭均可)

3.4編譯打包
點(diǎn)擊右上側(cè)的maven打開推窗,編輯package進(jìn)行編譯,等最下面的窗口打印日志,如果顯示Process finished with exit code 0 表示打包成功,Process finished with exit code 1 表示有錯(cuò)誤,根據(jù)日志提示修改完錯(cuò)誤重試。打包成功后會(huì)出現(xiàn)target文件夾,里面存放的是編譯之后的class和輸出的jar

pom文件附件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>yulisao</groupId>
<artifactId>yulisao</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <!--打包輸出方式,可以是jar、war等格式 -->
<name>這里寫你的項(xiàng)目名稱</name>
<description>這里寫項(xiàng)目簡(jiǎn)要描述</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!--構(gòu)建項(xiàng)目配置--> <!--這個(gè)可以解決因switch(字符串)無法編譯問題-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<!--這里是項(xiàng)目jar依賴節(jié)點(diǎn)配置-->
<dependencies>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<!--項(xiàng)目需要用到的架包,都依次按此格式寫好-->
</dependencies>
</project>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Sprigmvc項(xiàng)目轉(zhuǎn)為springboot的方法
本篇文章主要介紹了Sprigmvc項(xiàng)目轉(zhuǎn)為springboot的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
SpringBoot注冊(cè)Servlet的三種方法詳解
這篇文章主要介紹了SpringBoot注冊(cè)Servlet的三種方法詳解,教你如何Spring Boot 注冊(cè) Servlet、Filter、Listener,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
Java 異步線程監(jiān)聽與結(jié)果回調(diào)及異常捕獲總結(jié)分析
異常是程序之中導(dǎo)致程序中斷的一種指令流,異常一旦出現(xiàn)并且沒有進(jìn)行合理處理的話,那么程序就將中斷執(zhí)行,這篇文章綜合介紹了異步線程監(jiān)聽與結(jié)果回調(diào)及異常捕獲2021-11-11
Java中不得不知的Collection接口與Iterator迭代器
這篇文章主要介紹了Java中的Collection接口與Iterator迭代器,文中有詳細(xì)的代碼示例供大家參考,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06
Java Iterator迭代器_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
迭代器是一種模式,它可以使得對(duì)于序列類型的數(shù)據(jù)結(jié)構(gòu)的遍歷行為與被遍歷的對(duì)象分離,接下來通過本文給大家分享Java Iterator迭代器_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友參考下吧2017-05-05
基于Beanutils.copyProperties()的用法及重寫提高效率
這篇文章主要介紹了Beanutils.copyProperties( )的用法及重寫提高效率的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot參數(shù)驗(yàn)證10個(gè)技巧值得收藏
Spring Boot提供了內(nèi)置的驗(yàn)證注解,可以幫助簡(jiǎn)單、快速地對(duì)輸入字段進(jìn)行驗(yàn)證,例如檢查 null 或空字段、強(qiáng)制執(zhí)行長(zhǎng)度限制、使用正則表達(dá)式驗(yàn)證模式以及驗(yàn)證電子郵件地址,那么在Spring Boot應(yīng)用中如何做好參數(shù)校驗(yàn)工作呢,本文提供了10個(gè)小技巧感興趣的朋友一起看看吧2023-08-08
netty?pipeline中的inbound和outbound事件傳播分析
這篇文章主要為大家介紹了netty?pipeline中的inbound和outbound事件傳播分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

