这篇文章主要介绍了使用jar包反编译形成pom工程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这周接了一个需要吧把jar还原代码新建pom项目的工作,一百多个jar还是挺累的,鼠标用的都不灵敏了。当然这只是量的问题,下面记录一下具体的操作方法。
1. 反编译jar得到源码
1.1 使用jd-gui工具
这个不需要安装,下载之后压缩包里面有exe应用程序。打开jd-gui.exe,先设置一下反编译后不需要有注释。点击help -> preferences, 不要勾选write original line number 和write metadata
1.2 点击file - > open file 选中需要反编译的jar
或者直接把jar拖入到jd-gui的窗口。左边是列举包路径和文件,右边的窗口是显示源代码的
1.3 保存反编译的源代码
file -> save all source ,它会以zip的形式保存在本地计算机。
反编译之后的源文件有些是正常的,有部分可能是需要人工修复一下代码,比如反编译后有goto关键词,super指向报错等问题。可以换其他的反编译工具试试,再比对反编译之后的差异进行参考对其修复代码。这里还介绍一个反编译工具luyten,最新版本是0.0.5。其他的根据也很多,可以网上搜索。
如果同时使用不同的反编译工具,建议以某一个为主,其他做辅助参考。因为不同的反编译工具反编译之后的代码是有些差异的。比如变量名称,gd-gui是反编译是String str ,luyten 反编译是 String name,当然这个变量在整个类或者方法中都是一致的,不会报错关系不大,只是可阅读性是否容易看懂源码。格式上gd-gui会有很多断行空行没luyten整齐好阅读。luyten 的反编译速度没jd-gui快(luyten点击单个文件后右下角会显示进度条,100%时右边窗口就显示代码了)
2. ideal新建pom工程
2.1 file ->new ->project
选择maven选项,project SDK如果是第一次使用ideal的选择一下本机的jdk安装目录,点击下一步
2.2 GroupId 和 ArtifactId 可以自定义填写
建议都写项目名称,版本号自定义也可默认不修改
2.3 项目名称和项目文件保存路径会自动填入
(第一次使用ideal需要设置一下项目路径)
2.4 新建好的项目结构如下
3. 复制jar源码到pom工程
3.1 解压上面1.3那个步骤输出的zip
只需要复制主要代码到新pom项目下的src-main-java目录下
若解压后发现里面还有jar,说明你这个jar当时创建的时候本来就用了别人的jar,那这些解压后的jar在新建的pom工程肯定也是需要用上的,可以参考下面的3.2.1 步骤,也可以直接放在项目下和main-src-java 同一级目录就行,然后选中这些jar右键 选as Library 构建依赖。建议用下面3.2.1步骤的方案比较规范一些。
3.2 补充pom文件里面的配置
项目需要用到哪些jar都需要在此写好(文章末尾附有参考pom.xml文件),以下只列举了几个公网上可以自动下载到的jar。每次修改了pom文件后,右下角会出现弹框,点击import changes才会刷新依赖,java文件里面才能引用到新加的架包
3.2.1 如果用到了自己封装的jar,需要在本地仓库(我的是安装maven时默认的C:\Users\Administrator.m2\repository)下新建文件夹放好jar,下图圈出的三个分别是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 如果别人给了整个仓库给你,把仓库复制到C:\Users\Administrator.m2\下即可,然后file->setting到下面这个界面,选择别人给你的仓库就不用自己本地的仓库了。此处不建议把别人仓库下的文件下合并到自己的repository下面,可能会有问题引用不到的哟
3.3 检查源代码
反编译后有问题的代码片段,根据代码上下文进行修复或者自己写个与原来功能一致的代替。若遇道switch(字符串)有红色波浪线时(jdk1.7版本才开始支持字符串类型),可以参考如下设置file->Project Structure
Modules-> Source->language level选 8开头的这个(一般大于7开头均可)
3.4编译打包
点击右上侧的maven打开推窗,编辑package进行编译,等最下面的窗口打印日志,如果显示Process finished with exit code 0 表示打包成功,Process finished with exit code 1 表示有错误,根据日志提示修改完错误重试。打包成功后会出现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>这里写你的项目名称</name>
<description>这里写项目简要描述</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>
<!--构建项目配置--> <!--这个可以解决因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>
<!--这里是项目jar依赖节点配置-->
<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>
<!--项目需要用到的架包,都依次按此格式写好-->
</dependencies>
</project>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程学习网。
本文标题为:使用jar包反编译形成pom工程
基础教程推荐
- Java并发编程进阶之线程控制篇 2023-03-07
- Java数据结构之对象比较详解 2023-03-07
- Java实现线程插队的示例代码 2022-09-03
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java文件管理操作的知识点整理 2023-05-19
- java实现多人聊天系统 2023-05-19
- java基础知识之FileInputStream流的使用 2023-08-11
- springboot自定义starter方法及注解实例 2023-03-31
- Java实现查找文件和替换文件内容 2023-04-06
- JDK数组阻塞队列源码深入分析总结 2023-04-18