Contents

在Linux中解压缩WAR文件

1. 概述

我们经常将 Java Web 应用程序打包为 Web ARchive (WAR) 文件,以便部署Apache Tomcat 等容器中。实际上,WAR 文件只是具有特定目录结构的 ZIP 文件

在这个简短的教程中,我们将了解几种在 Linux 中提取 WAR 文件内容的方法。

2. 使用Unzip

Unzip 是一种流行的实用程序,我们可以使用它来提取 WAR 文件或任何类型的ZIP 存档。

让我们从一个非常简单的示例开始,将 WAR 文件的内容提取到当前工作目录中

unzip blogdemo-web-1.0.0.war

如果我们随后列出工作目录的内容,我们将看到 WAR 的内容:

META-INF
WEB-INF
css
favicon.ico
images
index.html
...

虽然这种方法有效,但它可能会使我们的工作目录有些混乱,尤其是当我们的 WAR 或工作目录中有许多其他文件时。

为了解决这个问题,我们可以使用*-d*选项将我们的 WAR 文件直接解压缩到不同的目录中以指定目录位置:

unzip blogdemo-web-1.0.0.war -d /tmp/blogdemo

我们还可以从 WAR 中提取单个文件,这在调试时非常有用

$ unzip blogdemo-web-1.0.0.war index.html
Archive:  blogdemo-web-1.0.0.war
  inflating: index.html

我们需要做的就是在存档名称之后传递我们希望提取的完整文件名和路径。在此示例中,我们有一个名为index.html的文件,它位于我们要提取的存档的根目录中

如果我们指定一个不存在的文件,我们会收到一个错误:

$ unzip blogdemo-web-1.0.0.war /bad/path/index.html
Archive:  blogdemo-web-1.0.0.war
caution: filename not matched:  /bad/path/index.html

最后,如果我们只是想在提取内容之前查看 WAR 文件,我们可以使用*-l*选项列出内容:

$ unzip -l blogdemo-web-1.0.0.war | more
Archive:  blogdemo-web-1.0.0.war
##   Length      Date    Time    Name
        0  05-27-2020 11:28   META-INF/
      131  05-27-2020 11:28   META-INF/MANIFEST.MF
        0  05-27-2020 11:28   css/
        0  05-27-2020 11:28   css/images/
        0  05-27-2020 11:28   css/fonts/
        0  05-27-2020 11:28   images/
## ...
 53893811                     974 files

正如我们所见,使用此选项会列出 WAR 中的所有文件以及时间戳。它还包括其他基本细节,例如文件大小和文件总数

我们应该注意,大多数 Linux 版本默认不提供unzip,但可以使用适当的包管理器轻松安装。

3. 使用jar

如果我们最终在一台安装了 Java 并且没有其他归档软件可用的机器上,我们可以使用jar 命令。** jar与unzip 类似,是一种通用的归档和压缩工具**,基于 ZIP 和 ZLIB 压缩格式。

现在我们将使用我们的blogdemo-web-1.0.0.war存档文件来完成与上一节相同的示例集。

同样,让我们开始将 WAR 文件的内容提取到当前工作目录中:

jar -xf blogdemo-1.0.0.war

我们使用x选项进行提取,使用f选项指定存档文件名。有点令人不安的是,我们不会看到控制台的任何输出。

但是,我们可以将生成详细输出的v选项添加到标准输出:

jar -xvf blogdemo-1.0.0.war

不幸的是,jar命令没有提供用于指定输出目录的选项。为此,我们必须在直接提取 WAR 之前导航到我们选择的文件夹。

unzip类似,我们还可以通过将文件名和路径作为参数传递来从 WAR 中提取单个文件

$ jar -xvf blogdemo-1.0.0.war index.html
 inflated: index.html

此外,我们还可以使用jar命令列出 WAR 的内容:

jar -tvf blogdemo-web-1.0.0.war

使用t选项可以让我们打印出存档中的内容。