jar 文件结构到底是什么
linux 系统里 jar 文件本质上就是一个 zip 压缩包,只是后缀名不同而已。它把一堆编译后的 class 文件、配置文件、资源文件打包在一起。很多运维和开发人员拿到一个不熟悉的 jar 包,第一反应就是想看看里面装了什么东西,有没有关键配置,版本对不对。直接解压当然可以,但有时候服务器上没有图形界面,或者你只是临时想确认一下内容,完全没必要解压出来。

jar 文件的结构一般包括 META-INF 目录下的清单文件 MANIFEST.MF,那是 jar 包的“身份证”,会写明主类、版本号、依赖信息。还有各种 properties 或 yml 配置文件,以及一堆 class 字节码文件。了解这些结构以后,你就知道从哪些地方入手查看内容了。
怎么用 unzip 命令查看 jar 包内容
unzip 是 linux 系统自带的解压工具,处理 jar 文件非常顺手。你不需要解压整个包,只需要用 -l 参数就能列出 jar 包里的所有文件和目录。比如你有一个 app.jar,直接运行 unzip -l app.jar,终端就会列出里面所有文件的路径和大小,一目了然。

如果只想看某个具体文件的内容,比如 application.yml,你可以用 unzip -p app.jar BOOT-INF/classes/application.yml,-p 参数会把文件内容直接输出到终端,不会生成临时文件。这种方法很适合快速查看配置文件,也不需要清理垃圾文件。注意文件路径要写准确,可以先通过 -l 查看完整路径,再针对性读取。
用 jar 命令本身查看内容
很多 linux 系统安装了 JDK 或 JRE,jar 命令是自带的。用 jar tf app.jar 也能列出 jar 包里的文件列表,t 代表 list table,f 指定文件名。这个命令输出的结果和 unzip -l 类似linux运维面试题,但更简洁,不显示文件大小和压缩率。适合你只想知道有哪些文件,不关心具体尺寸的场景。

如果想把 jar 包里的某个文件提取出来linux查看jar文件内容,可以用 jar xf app.jar BOOT-INF/classes/application.yml,x 代表 extract。这样只会解压你指定的文件到当前目录,其他文件不动。对于运维人员排查线上问题,这种方法比整个解压要安全得多,不会误改其他文件。
用 vim 命令直接查看 jar 内容
vim 这个编辑器其实能直接打开 jar 文件linux查看jar文件内容,把它当成一个归档文件来处理。在终端输入 vim app.jar,你会看到类似文件管理器的界面,里面列出了 jar 包的所有条目。你可以用键盘上下键选择文件,回车就能查看文件内容,甚至直接编辑里面的配置文件。
这个方法特别适合你想快速浏览多个文件的时候,不用频繁输入命令。vim 还支持搜索,按 / 输入文件名关键词就能定位。查看完直接 :q 退出,不会对 jar 包造成任何修改。对于没有图形界面的服务器,vim 查看 jar 是很多老手喜欢的操作方式。
查看 jar 包里的 class 文件
class 文件是二进制字节码,直接 cat 或者 vim 打开会看到一堆乱码。但你可以用 javap 命令反编译查看类的方法和属性。先用 jar 命令把 class 文件提取出来,比如 jar xf app.jar com/example/Hello.class,然后运行 javap -c com/example/Hello,就能看到字节码指令,虽然不如源码直观linux命令chm,但能判断方法逻辑和数据流向。
如果你安装了 jad 或者 cfr 这样的反编译工具,可以把 class 文件反编译成近似 java 源码的格式。比如 java -jar cfr.jar Hello.class,得到的结果可读性很高。生产环境上不建议频繁做反编译,但排查某些难以定位的 bug 时,这一招往往能救命。
不管用哪种方式,关键是养成习惯:先列清单看结构,再针对性提取文件,最后分析内容。linux 下操作 jar 文件不需要解压整个包,灵活用好这几个命令,既节省磁盘空间,也避免搞乱文件。
