【问题标题】:Is there a quick way to delete a file from a Jar / war without having to extract the jar and recreate it?有没有一种快速的方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?
【发布时间】:2011-05-30 01:56:40
【问题描述】:

所以我需要从 jar / war 文件中删除一个文件。 我希望有类似“jar -d myjar.jar file_I_donot_need.txt”的东西

但现在我可以从我的 Linux 命令行(不使用 WinRAR/Winzip 或 linux 等效项)中看到这样做的唯一方法是

  • 执行“jar -xvf”并解压
    完成 Jar 文件
  • 删除我不需要的文件
  • 使用“jar -cvf”重新压缩 jar 文件

请告诉我有更短的方法吗?

【问题讨论】:

  • 由于“jar”只是一个 zip 文件,我怀疑你在superuser.com 上会更好。
  • 您也可以尝试编写一个shell脚本来包装整个过程。类似./myscript.sh -d <list of files>

标签: java linux jar


【解决方案1】:
zip -d file.jar unwanted_file.txt

jar 毕竟只是一个 zip 文件。绝对比解压缩/重新压缩快得多。

【讨论】:

  • 我经常安装 p7zip 而不是 zip,在这种情况下,指定文件格式很重要:7z d -tzip file.jar dir/unwanted_file.txt
  • @martona 我收到以下错误:zip 错误:Zip 文件结构
  • @Goaler444 我有同样的错误,但使用 7z 作为 lapo 建议对我有用。
  • 如果要删除 jar 中的文件夹,请确保不需要的文件夹上有一个斜杠:zip -d file.jar unwanted_folder/
  • 还有一点让我费了不少时间:您不能删除非空文件夹。在删除其父级之前,必须先删除所有文件/文件夹。
【解决方案2】:

在 Java 中,您可以复制 jar 中的所有条目,但要删除的条目除外。即您必须制作副本,但不需要创建单独的文件。

你可以这样做

  • 创建一个新罐子。
  • 迭代你拥有的 Jar
  • 将条目从一个 jar 复制到另一个,跳过您想要的任何文件。
  • 如果需要,请关闭并更换原来的罐子。

【讨论】:

    【解决方案3】:

    如果您想删除文件以取消签名已签名的 jar,您可能只需将 .RSA 文件设为零大小。这可以通过jar u 来完成。见https://stackoverflow.com/a/24678645/653539。 (为我工作,虽然我承认这是 hack。)

    【讨论】:

      【解决方案4】:

      如果您希望以编程方式执行此操作,可以使用 Zip 文件系统将 zip/jar 文件视为文件系统。这将允许您对 jar 文件进行编辑、删除和添加文件。

      Appending files to a zip file with Java

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2012-07-20
        • 1970-01-01
        相关资源
        最近更新 更多