【问题标题】:Modifying a file inside a jar修改 jar 中的文件
【发布时间】:2010-11-16 12:36:15
【问题描述】:

我想修改 jar 中的文件。是否可以在我的应用程序中不提取和重新震动来执行此操作?

我要修改的文件是配置文件,主要是基于xml的。

我对不震动感兴趣的原因是,如果我解压应用程序,我无法再次创建 .exe 文件。

【问题讨论】:

  • 我希望将补充文件保留在应用程序中,而不在文件系统上创建临时文件。
  • 试试这个解决方案stackoverflow.com/a/4837522/1853864我用过,我的问题解决了。
  • 您能不接受当前接受的答案吗?它有一个负分,绝对没有帮助

标签: java jar


【解决方案1】:

只要这个文件不是 .class,即资源文件或清单文件 - 你可以。

【讨论】:

  • 以及如何在不提取和重新震动的情况下?
【解决方案2】:

Java jar 文件与 zip 文件的格式相同 - 因此,如果您有一个 zip 文件实用程序可以让您修改存档,那么您就可以涉足了。第二个问题是,如果你想重新编译一个类或其他东西,你可能只需要重新构建 jar;但是文本文件或其他东西(例如 xml)应该很容易修改。

【讨论】:

    【解决方案3】:

    扩展 dfa 所说的,原因是因为 jar 文件的设置类似于 zip 文件。如果要修改文件,必须读出所有条目,修改要更改的条目,然后将条目写回 jar 文件。我以前必须这样做,这是我能找到的唯一方法。

    编辑

    请注意,这是使用 Java jar 文件编辑器的内部,它们是文件流。我相信有办法做到这一点,您可以将整个 jar 读入内存,修改所有内容,然后写回文件流。这就是我认为 7-Zip 和其他实用程序正在做的事情,因为我认为 zip 标头的 ToC 必须在写入时定义。但是,我可能是错的。

    【讨论】:

      【解决方案4】:

      这可能比您在短期内要处理的工作要多,但我怀疑从长远来看,考虑使用Ant(或Maven,甚至Bazel) 而不是手动构建 jar。这样,您只需单击 ant 文件(如果您使用 Eclipse)并重建 jar。

      或者,您可能根本不希望 jar 中包含这些配置文件 - 如果您希望定期替换这些文件,或者如果它应该分发给多方,则配置文件不应该完全成为罐子的一部分。

      【讨论】:

      • 同意。但是,您可能希望在 JAR 中放置一个“默认”配置文件,因此如果外部配置文件出现问题(损坏、删除等),您可以回退到默认配置。
      • 是的 - 虽然我不知道有多少应用程序在没有配置文件的情况下会继续运行......
      【解决方案5】:

      正如许多人所说,如果不重新制作 JAR,就无法更改 JAR 中的文件。使用 Launch4J 更糟糕的是,您必须在更改 JAR 后重新构建 EXE。所以不要走这条路。

      将配置文件放在 JAR 中通常是个坏主意。这是我的建议。在一些预先确定的位置(如主目录、\Program Files\ 等)中搜索您的配置文件。如果找到配置文件,请使用它。否则,使用 JAR 中的那个作为后备。如果你这样做,你只需要在预先确定的位置写入配置文件,程序就会把它捡起来。

      这种方法的另一个好处是,如果您升级软件,修改后的配置文件不会被覆盖。

      【讨论】:

        【解决方案6】:

        是的,你可以,使用 SQLite,你可以从 jar 文件中读取或写入数据库,这样你就不必提取然后重新 jar 它,关注我的帖子http://shoaibinamdar.in/blog/?p=313

        使用语法“jdbc:sqlite::resource:”,您将能够从 jar 文件中读取和写入数据库

        【讨论】:

        • 嗨,欢迎来到 stackoverflow。我已从您的帖子中删除了缩写词。一般来说,短信风格的简写在这里是不合适的。如果您在答案本身中包含更多来自博客的详细信息,我认为这个答案将是一个很好的答案,以便阅读您的答案的人即使不阅读博客也能学到一些东西,或者它被感动在将来某个日期转到另一个 URL。
        【解决方案7】:

        查看TrueZip

        它通过虚拟文件系统 API 完全按照您的需要(编辑 jar 文件内的内联文件)。它还支持嵌套存档(jar 中的 jar)。

        【讨论】:

          【解决方案8】:

          您可以为jar 使用u 选项

          来自 Java 教程:

          jar uf jar-file input-file(s)
          

          “存档中已存在的与正在添加的文件具有相同路径名的任何文件都将被覆盖。”

          Updating a JAR File

          比重新制作整个罐子要好得多。从你的程序中调用它听起来也是可能的。试试Running Command Line in Java

          【讨论】:

          • 太棒了!但是他们添加了有趣的路径名。 IE Bitbucket.foo.bar 而不是现有的 com.etc.etc
          【解决方案9】:

          解压 jar 文件为 ex.使用 winrar 并使用 CAVAJ:

          Cavaj Java Decompiler 是一个图形化的免费软件实用程序,可以从 CLASS 文件中重构 Java 源代码。

          如果您需要,这里是视频教程: https://www.youtube.com/watch?v=ByLUeem7680

          【讨论】:

          • 好吧,“使用 CAVAJ”软件就是这里的答案。如果需要任何额外的解释,该链接只是添加。
          【解决方案10】:

          不确定这是否有帮助,但您可以在不提取的情况下进行编辑:

          1. 从 vi 编辑器打开 jar 文件
          2. 从列表中选择要编辑的文件
          3. 按回车键打开文件做转换器并保存 很简单

          查看博文了解更多详情 http://vinurip.blogspot.com/2015/04/how-to-edit-contents-of-jar-file-on-mac.html

          【讨论】:

            【解决方案11】:

            你可以使用 Vim:

            vim my.jar

            Vim 能够编辑压缩文本文件,前提是你的环境中有 unzip

            【讨论】:

            • 这很棒。导航到您要查找的文件,然后按 Enter。编辑文件,然后输入 :wq 保存!
            • 您的环境中还需要zip,才能保存更改。感谢您的回答!
            【解决方案12】:

            我发现在 Windows 中执行此操作的最简单方法是使用 WinRAR

            1. 右键单击文件并从上下文菜单中选择“使用 WinRAR 打开”。
            2. 导航到要编辑的文件并双击它以在默认编辑器中打开它。
            3. 进行更改后,保存并退出编辑器。
            4. 然后会出现一个对话框,询问您是否要更新存档中的文件 - 选择“是”,JAR 将被更新。

            【讨论】:

              【解决方案13】:

              上面的大多数答案都说你不能为类文件这样做。

              即使您想更新类文件,您也可以这样做。 您需要做的就是将类文件从您的工作区拖放到 jar 中。

              如果您想验证类文件中的更改,可以使用 jd-gui 之类的反编译器来完成。

              【讨论】:

                【解决方案14】:

                我有类似的问题,我需要修改/更新 jar 文件中的 xml 文件。

                jar 文件由 Spring-boot 应用程序创建,文件位置为 BOOT-INF/classes/properties

                我指的是这个document 并试图用这个命令替换/更新文件:

                jar uf myapp.jar BOOT-INF/classes/properties/test.xml

                但是这样,它不会更改给定位置的文件。我也尝试了所有选项,但都不起作用。

                注意:我从 jar 文件所在的位置执行的命令。

                我找到的解决办法是:

                1. 从 jar 文件的当前位置,我创建了文件夹 BOOT-INF/classes/properties
                2. 将 test.xml 文件复制到位置 BOOT-INF/classes/properties。
                3. 再次运行相同的命令。 jar uf myapp.jar BOOT-INF/classes/properties/test.xml

                jar文件中的xml文件已更改。

                基本上你需要创建一个文件夹结构,就像文件在 jar 文件中的位置一样。将文件复制到该位置,然后执行命令。

                文档的问题在于,它没有足够的示例以及对常见场景的解释。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-01-12
                  • 2010-09-09
                  • 1970-01-01
                  • 2011-01-28
                  • 1970-01-01
                  • 2021-11-23
                  • 2013-07-25
                  • 2017-09-17
                  相关资源
                  最近更新 更多