IDEA 反编译出整个 Jar 包源码

对一些历史遗留的老项目,在只有 Jar 包、而缺少对应源码的情况下,我们需要通过反编译的方式,来获取 Java 源代码。

下面介绍 InteliJ IDEA 反编译 Jar 包的方法。

插件安装

保证您的 idea 配置有如下插件 Java Bytecode Decomplier。File–>Settings–>Plugins,在搜索框内搜出后勾选,并应用。

image-20220428164232075

反编译

在您需要编译的 jar 包的目录下,打开命令行界面,输入以下命令:

java -cp "C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.3\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true dbTool.jar mysrc

异常处理

JDK 版本不一致

可能出现报错如下:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/jetbrains/java/decompiler/main/decompiler/ConsoleDecompiler has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

这是由于本地默认的 Java 版本与 InteliJ IDEA 插件版本的 JDK 不一致导致的,使用对应的 JDK 版本即可。

如下所示:

E:\software\Java\jdk-11.0.1\bin\java.exe -cp "C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.3\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true dbTool.jar mysrc

缺少目标文件夹

可能出现报错如下:

error: destination 'mysrc' is not a directory

在执行目录下新建对应的文件夹即可。

解压反编译结果

等指令运行完毕之后,会在您所制定的目录(示例是 mysrc)中生成的打包好的源码,一般是 jar 格式的压缩文件。您可以进行解压查看。

底层实现

底层是使用 fernflower 实现的:

https://github.com/fesh0r/fernflower