1. 概述

我们之前已经介绍过 如何从 JAR 文件中获取类名 的方法,并且在那篇文章中也讨论了如何在 Java 应用中获取 JAR 文件中的类名。

本文将介绍另一种方式:通过命令行工具查看 JAR 文件的内容

此外,我们还会介绍几个图形化工具,用于更详细地查看 JAR 文件的内容,例如 Java 源代码等。

2. 示例 JAR 文件

在本文中,我们将继续使用 stripe-0.0.1-SNAPSHOT.jar 作为示例来演示如何查看 JAR 文件的内容:

a jar example 1

3. 使用 jar 命令查看

我们已经知道,JDK 自带的 jar 命令 可以用来查看 JAR 文件的内容:

$ jar tf stripe-0.0.1-SNAPSHOT.jar 
META-INF/
META-INF/MANIFEST.MF
...
templates/result.html
templates/checkout.html
application.properties
com/baeldung/stripe/StripeApplication.class
com/baeldung/stripe/ChargeRequest.class
com/baeldung/stripe/StripeService.class
com/baeldung/stripe/ChargeRequest$Currency.class

如果只想查看特定类型的文件(如 .class.properties),可以将输出通过管道传递给过滤工具,例如 grep

$ jar tf stripe-0.0.1-SNAPSHOT.jar | grep "\.class$"

✅ 优点:简单直接,JDK 自带,无需额外安装。

❌ 缺点:没有 JDK 环境时无法使用。

4. 使用 unzip 命令查看

⚠️ JAR 文件本质上是 ZIP 格式的压缩包,所以任何能处理 ZIP 文件的工具,理论上都可以用来查看 JAR 文件。

在 Linux 环境下,unzip 是一个常用的命令行工具,可以通过 -l 参数列出 ZIP 文件(包括 JAR 文件)的内容,而无需解压:

$ unzip -l stripe-0.0.1-SNAPSHOT.jar
Archive:  stripe-0.0.1-SNAPSHOT.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-10-16 20:53   META-INF/
...
      137  2020-10-16 20:53   static/index.html
      677  2020-10-16 20:53   templates/result.html
     1323  2020-10-16 20:53   templates/checkout.html
       37  2020-10-16 20:53   application.properties
      715  2020-10-16 20:53   com/baeldung/stripe/StripeApplication.class
     3375  2020-10-16 20:53   com/baeldung/stripe/ChargeRequest.class
     2033  2020-10-16 20:53   com/baeldung/stripe/StripeService.class
     1146  2020-10-16 20:53   com/baeldung/stripe/ChargeRequest$Currency.class
     2510  2020-10-16 20:53   com/baeldung/stripe/ChargeController.class
     1304  2020-10-16 20:53   com/baeldung/stripe/CheckoutController.class
...
---------                     -------
    15394                     23 files

✅ 优点:无需 JDK,跨平台支持好,适合临时查看。

❌ 缺点:只能看到文件名和大小,无法查看源码。

5. 使用图形化工具查看 JAR 文件

虽然命令行工具很方便,但它们只能列出文件名。如果需要查看 Java 源码、方法、字段等信息,就需要借助图形化工具了。

5.1. JD-GUI

JD-GUI 是一个非常流行的 Java 反编译图形工具,基于 JD-Core 实现。

JD-GUI 本身是一个 JAR 文件,可以通过如下方式启动:

$ java -jar jd-gui-1.6.6.jar

启动后,可以通过菜单 File -> Open File... 或者直接拖拽 JAR 文件打开。

打开后,所有类都会自动反编译,左侧是类结构树,右侧是源码:

20201209_232956

✅ 优点:

  • 支持类、方法、字段的导航
  • 多标签页支持
  • 反编译效果好

❌ 缺点:

  • 依赖 Java 环境
  • 不支持切换反编译器

5.2. Jar Explorer

Jar Explorer 是另一个图形化工具,支持拖拽操作,启动简单。

它支持三种主流反编译器:

  • JD-Core
  • Procyon
  • Fernflower

可以在查看源码时切换反编译器:

20201210_000351

✅ 优点:

  • 支持多种反编译器
  • 操作简单

❌ 缺点:

  • 不支持多标签页
  • 左侧导航只到类级别
  • 每次切换类都会重新反编译

5.3. Luyten

Luyten 是基于 Procyon 的图形化反编译工具,支持多种平台(Windows、macOS、Linux),提供 .exe.jar 两种格式。

启动方式如下:

$ java -jar luyten-0.5.4.jar 

打开后,同样支持拖拽 JAR 文件,查看内容:

20201210_003959

✅ 优点:

  • 支持多标签页
  • 提供多种反编译选项
  • 支持主题切换

❌ 缺点:

  • 不支持切换反编译器
  • 文件结构只显示到文件级别

6. 小结

本文介绍了多种查看 JAR 文件内容的方式:

方法 是否需要 JDK 是否支持源码查看 是否支持多标签页
jar 命令 ✅ 是 ❌ 否 ❌ 否
unzip 命令 ❌ 否 ❌ 否 ❌ 否
JD-GUI ✅ 是 ✅ 是 ✅ 是
Jar Explorer ✅ 是 ✅ 是 ❌ 否
Luyten ✅ 是 ✅ 是 ✅ 是

如果只是简单查看文件列表,命令行工具足够;如果需要查看源码和结构,推荐使用 JD-GUI 或 Luyten。

简单粗暴总结一句话:命令行看文件名,图形工具看源码


原始标题:Viewing Contents of a JAR File