【问题标题】:How do I update one file in a jar without repackaging the whole jar?如何在不重新打包整个 jar 的情况下更新 jar 中的一个文件?
【发布时间】:2021-11-04 14:36:55
【问题描述】:

我有一个名为 myfile.jar 的 .jar 文件。在这个 jar 文件中是一个名为 images 的文件夹。在这个名为 images 的文件夹中,我有一个名为 hi.png 的图像。我想用该图像的新版本更新该图像,也称为 hi.png。我不想从单个 jar 文件中提取所有文件然后重新打包它们,我只想更新图像。所以,我像往常一样进入命令行,输入几行代码,然后执行以下命令:

jar uf myfile.jar -C images hi.png

我希望用那个命令做的是用新的 hi.png 替换旧的 hi.png。但是,它给了我这个错误:

images\hi.png : no such file or directory

我该怎么做才能解决这个问题?

额外信息:我不能使用 WinRAR 之类的东西,我必须使用命令行来执行此操作。

【问题讨论】:

  • jar 文件也是 zip 文件,因此 zip tool 可以对其进行操作。如果你在任何非 Windows 上,你应该已经安装了它。 (我认为 MacOS 会有,但我无法验证。)
  • 不确定你的设计是什么……但是 7Zip 有很好的命令行支持。请注意,jar 规范对 zip 的确切类型很挑剔。其次,如果这是基于 Web 的,您可能可以使用扩展的 jar。而且...如果它不是基于 Web 的(单个客户端),为什么不从 ./images/hi.png 加载图像。 TL;博士;用简单的方法来做,如果你在一个文件系统上交换使用文件系统。
  • 您在哪个目录中执行此操作(以及相对于您的 cwd,images 和 hi.png 在哪里)?
  • @FakeRainBrigand 它在所有版本的 OS X 上
  • 1) 我通常会使用 Ant 或其他构建工具来懒惰地构建 Jars(仅在资源更新时)2) 由于 Zip 对大多数媒体类型(至少声音、视频和图片),我通常也会把它们放在一个单独的罐子里,没有压缩。

标签: java jar


【解决方案1】:

-C 正在更改本地目录,并正在那里寻找hi.png。它不控制您尝试将其注入 JAR 文件的位置。

我会尝试创建一个名为images 的新目录,将您的本地hi.png 移动到该目录中,使images 成为您当前工作目录的子目录,然后运行以下代码:

jar uf myfile.jar images\hi.png

【讨论】:

  • 它仍然给我那个错误 images\hi.png : no such file or directory
  • 我刚刚对此进行了实际测试,它按预期工作。确保您的工作目录是包含“图像”的目录。你能显示你的命令提示符的导出,显示目录结构和你正在尝试的确切命令吗?
  • +1 获取 joev 的评论。由于我在错误中看到“images\hi.png”,我想我假设是 Windows。
  • 抱歉,我的做法与您所说的完全不同,现在一切正常,非常感谢!
  • 我知道这是一个老问题答案,但我发现它不适用于替换“BOOT-INF/classes/logback-spring.xml”文件的spring boot runnable jar,它给了我“错误:无效或损坏的 jarfile”
【解决方案2】:

最简单的方法是使用 7-zip 软件。对于

  1. 编辑文件:

    • 打开 jar 文件 7-zip |打开存档
    • 转到文件,例如/Meta-Inf/xyz.conf
    • 右击鼠标并选择“打开内部”选项
    • 编辑文件并保存文件
    • 关闭 7-zip 控制台就完成了。
  2. 用于添加/替换/删除文件。

    • 按照前两个步骤,直到到达所需的文件夹。
    • 删除:删除文件
    • 添加:将文件拖放到 7-zip 控制台。
    • 关闭控制台就完成了。

【讨论】:

  • 谢谢,这是无需重新打包即可更新 jar 文件的最简单方法。
  • 如果“内部打开”选项没有打开文件,则直接点击“编辑”选项。它将在记事本中打开文件,更改它然后保存。
【解决方案3】:

你可以使用jar -uf sample.jar [path in jar file]target-file

【讨论】:

    【解决方案4】:

    您可以使用“jar”命令行来提取文件并创建一个新的 jar 文件。

    更多详情您可以通过how to replace a image in a jar file查看

    # create a new folder
    mkdir contents
    # extract jar file
    jar xf example-1.5.jar
    # Then you'll get a list of new files from jar
    ls
    # update your images in it
    # create a new jar
    jar cf example-1.5.jar *
    

    【讨论】:

      【解决方案5】:

      如果你想扩展 Spring Boot 应用程序(例如用于 e2e 测试目的),这个对我有用:

      Dockerfile 的一部分:

      COPY ./libs/*.jar /BOOT-INF/lib/
      RUN jar u0f /app.jar /BOOT-INF/lib/*.jar
      

      【讨论】:

        【解决方案6】:

        Jar 文件类似于 zip 文件。当你编辑一个 zip 文件时,vim 会解压它并允许你编辑 zip 文件内的文件。只需在文件上导航并按 Enter,您就可以在存档中编辑文件。

        (假设您有 unzip 可用,例如 CentOS 上的 yum install -y unzip

        vim my.jar

        【讨论】:

        • .jar 文件不是文本文件。
        • 非常感谢这个提示!我对 vim 不了解,当我需要更改 jar 文件中的一些属性设置时,这是一个完美的提示!
        • 哪句话让你觉得A .jar file is a text file
        • @user207421 那又怎样? Vim 有一个用于处理内置 zip 文件的插件
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 2011-04-05
        • 2011-05-15
        • 2019-11-02
        • 1970-01-01
        • 1970-01-01
        • 2015-09-02
        相关资源
        最近更新 更多