返回

Jar/War文件快速删除文件:zip 和 jar -u 高效技巧

Linux

从 Jar/War 文件中快速删除文件

当需要从已有的 Jar 或 War 文件中移除特定文件时,常见的方法是将整个文件解压,删除目标文件后,再重新打包。这个过程较为繁琐,且在大型应用中耗时较长。本文将介绍几种更高效的方式,以避免不必要的解压和重新打包步骤。

利用 zip 工具直接修改

实际上,Java 的 Jar 和 War 文件本质上都是 ZIP 压缩文件。利用这个特性,可以使用 zip 工具直接进行文件的删除操作,而无需先进行解压。这种方式更为快捷且节省资源。

操作步骤:

  1. 确定要删除的文件在 Jar/War 文件中的完整路径(包括目录结构)。
  2. 使用 zip 命令的 -d 选项,指定需要删除的文件。

命令示例:

zip -d myapp.war WEB-INF/classes/unwanted_class.class

这条命令会直接从 myapp.war 文件中删除位于 WEB-INF/classes/ 目录下的 unwanted_class.class 文件。注意路径名的大小写和正斜杠方向,它需与 JAR 包中存储的路径完全一致。

说明:

  • -d 选项表示“delete”,用于从压缩文件中删除指定的文件或目录。
  • 此命令直接作用于 jarwar 文件本身,不会产生额外的临时文件,节约磁盘空间。
  • 使用前最好备份原文件。以防操作失误导致数据丢失。

使用 Java 的 jar 命令(jar -u)的更新模式

虽然 jar 命令没有直接删除文件的选项,但是它的更新(update)模式可以覆盖或删除 JAR 中的文件,当使用覆盖的空文件时可以达到删除的效果。这通过与系统上的一个“空文件”进行“覆盖”来完成“删除”。

操作步骤:

  1. 创建一个“空文件”。可以使用 touch emptyfile 创建。这个文件仅用来覆盖要删除的那个文件,本质是一个长度为 0 的空字节文件。
  2. 利用 jar 命令的 -u 选项和空文件覆盖指定文件。

命令示例:

touch emptyfile
jar -uf myapp.war  WEB-INF/classes/unwanted_class.class emptyfile

执行命令后,指定的class 文件内容会被空文件覆盖。此时,你可以把空的 class 文件理解为该文件的 "空状态" 。尽管它没有被真正地移除出压缩文件,但是在程序运行和功能层面来讲,你可以认为这个文件被 "删除" 了,因为程序无法读取和加载这“空的类” 文件,它对系统的作用等价于这个文件已经不在 JAR 包里面。

说明:

  • -u 选项是 jar 命令的更新模式。
  • 覆盖的“空文件”本身并不会被写入 JAR 中。
  • 需要使用完全路径来指定要覆盖的文件,以确保准确操作。

选择合适的方案

选择哪个方案取决于实际情况和个人偏好。 zip 命令方法通常是最直接高效的,且无需依赖额外的文件,比较便捷。使用 jar -u 命令, 虽然本质不是“真正”删除,但是能达到删除的相同目的,并且它利用了 Java 内置工具的特性。 需要注意的是: 这两种方案都存在一个操作风险,即指定路径和文件名一定要正确。 如果存在路径错误,或者文件错误的情况,可能将不是目标文件删除了。 操作之前请先做好备份。

总的来说,上述方法能提供更快速的文件删除操作。 适当选择它们能大幅简化工作流程并节约宝贵的时间和系统资源。

相关资源

GNU Zip Manual (查看 zip 命令的详细用法)

Java Jar Tool Documentation (Java jar 命令的官方文档)