如何查看jar包里的源码:多工具实操对比
如何查看jar包里的源码,主流方案分为直接反编译查看、IDE插件联动、命令行解压搭配反编译三类,直接解压jar只能获取class字节码,无法阅读可读Java源码,JD-GUI适合快速浏览单文件,IDEA插件适合工程关联调试,fernflower反编译引擎还原代码结构较为稳定,该系列方法适合手里仅有jar包、无配套源码包的开发人员,不适合需要获取开发者原始未编译注释、完整提交记录的场景。
jar包基础解压与字节码查看
jar本质是zip压缩包,你可以用系统自带解压软件或者unzip命令解压文件,解压后得到的全部是class文件,class是JVM可识别的字节码,文本打开只会显示乱码,无法直接当作源码阅读。javap是JDK自带工具,它只能输出字节码指令、方法签名、常量池信息,不能还原出带循环、分支逻辑的Java源码,适合简单核对方法参数,不适合通读业务逻辑。执行命令格式为javap-c类名.class,你需要切换到class所在目录运行,且环境变量已经配置好JDK路径。
javap只看字节码。
图形化反编译工具查看jar包里的源码
| 工具名称 | 反编译引擎 | 优势 | 局限 |
|---|---|---|---|
| JD-GUI | jd-core | 打开即用,直接加载整个jar,检索类名方便 | 新版本复杂泛型、lambda代码还原容易出错,停止维护 |
| Luyten | fernflower | 代码缩进规整,支持调整反编译参数,导出源码 | 大体积jar加载速度偏慢,搜索响应存在延迟 |
| CFR | CFR自研引擎 | 对Java8及以上新语法兼容更好,命令行+图形界面都可用 | 部分注解、内部类还原存在少量偏差 |
Luyten是更稳妥的日常选择,下载启动程序后,直接把jar文件拖拽进窗口,左侧会展示包结构,点击类文件就能看到还原后的源码,你还可以勾选保留变量名、显示字节码对照选项,导出为java文件保存到本地。CFR支持命令行批量处理,命令示例为java-jarcfr-0.152.jartarget.jar--outputdirsrc,适合批量处理多个jar包的场景。
IDE内查看jar包里的源码
IntelliJIDEA搭配fernflower内置反编译器,不需要额外单独打开软件,你把jar作为依赖添加进项目之后,双击对应的类,IDE会自动触发反编译展示源码。如果IDE提示找不到源码,你可以在弹窗里选择“FetchSources”,部分公共仓库可以拉取官方原始源码,私有jar没有上传源码时,IDE就会使用内置反编译引擎生成代码。Eclipse需要单独安装EnhancedClassDecompiler插件,在插件设置里指定fernflower作为默认引擎,重启之后才能正常打开class文件。
IDE模式的优势是可以跳转关联类、检索引用,和写代码的环境统一,缺点是新建项目、导入依赖会多出几步操作,单纯快速扫一眼源码时,不如独立图形工具轻便。反编译得到的代码不会包含开发者写的全部注释,编译阶段很多注释会被编译器丢弃,变量名也可能变成a、b这种简写名称,和原始源码存在一定差别。
反编译产出代码仅用于个人学习排查。
国内《计算机软件保护条例》保护软件源代码著作权,未经权利人许可,对商用闭源jar包进行反编译、复制、分发,会存在著作权相关法律风险,仅允许在合理使用范围,用于自身学习、排查兼容故障。开源jar需要严格遵守它附带的开源协议,比如GPL协议要求衍生作品同步开源,MIT协议限制更少,你使用前要确认对应协议条款。
遇到经过代码混淆的jar包,所有反编译工具都很难还原出有意义的变量名、类名,这类场景下反编译价值较低,优先查阅官方文档而不是强行解析代码。
