IDEA 反编译出整个 Jar 包源码
对一些历史遗留的老项目,在只有 Jar 包、而缺少对应源码的情况下,我们需要通过反编译的方式,来获取 Java 源代码。
下面介绍 InteliJ IDEA 反编译 Jar 包的方法。
插件安装
保证您的 idea 配置有如下插件 Java Bytecode Decomplier。File–>Settings–>Plugins,在搜索框内搜出后勾选,并应用。
反编译
在您需要编译的 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
相关文章