如何查看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-GUIjd-core打开即用,直接加载整个jar,检索类名方便新版本复杂泛型、lambda代码还原容易出错,停止维护
Luytenfernflower代码缩进规整,支持调整反编译参数,导出源码大体积jar加载速度偏慢,搜索响应存在延迟
CFRCFR自研引擎对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包,所有反编译工具都很难还原出有意义的变量名、类名,这类场景下反编译价值较低,优先查阅官方文档而不是强行解析代码。

敬慕百科汇集百科知识与游戏文化,带你发现世界的每一个精彩角落。

想要了解更多关于如何查看jar包里的源码的文章欢迎访问:百科