java - 修改执行 Jar 文件

标签 java file-io jar classloader executable-jar

你好 Stack Overflow 的 friend 们。我有一个简单的问题,我担心没有简单的解决方案,我需要有关如何进行的建议。我正在开发一个打包为可执行 JAR 的 java 应用程序,但它需要在执行期间修改其某些 JAR 文件内容。在这个阶段我遇到了一个问题,因为一些操作系统锁定了文件以防止写入它。

在应用程序退出时,用户必须看到更新版本的 jar 文件,尽管我可以非常灵活地实现这一点。干净高效的解决方案显然是可取的,但可移植性是唯一的硬性要求。

以下是我可以看到的解决问题的三种方法,请随时发表评论或提出其他建议。

  1. 告诉 Java 解锁 JAR 文件以进行写入(这似乎不可能,但这是最简单的解决方案)
  2. 在应用程序启动时将可执行类文件复制到临时文件,使用类加载器加载这些文件并从初始 JAR 文件中卸载这些文件。(对类加载器没有太多经验,但希望 JVM 会变得聪明足以意识到原始 JAR 不再使用并解锁它)
  3. 将第二个可执行 JAR 文件放入第一个文件中,在启动时将内部 jar 提取到临时文件,使用复制的内部 JAR 调用一个新的 java 进程并将外部 JAR 的位置传递给它,第一个进程退出,第二个进程修改外部 jar 不受阻碍。(这会起作用,但我不确定是否有一种独立于平台的方式让一个 Java 应用程序调用另一个)

我知道这是一个奇怪的问题,但我们将不胜感激。

最佳答案

一个选项:

让程序写入 JAR 文件的修改副本

在 JAR 文件中包含第二个带有实用程序的 JAR,该实用程序在执行时删除原始 JAR 文件并重命名修改后的副本以匹配原始文件。

当您的程序退出(并进行了更改)时,提取此实用程序并在其自己的 JVM 中启动它(使用 Runtime.getRuntime().exec())。该实用程序将等待锁定解除原始的、未修改的 JAR,然后执行其业务并退出。

对于用户来说,JAR 文件似乎会在退出时更新(或足够接近!)。

关于java - 修改执行 Jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463785/

相关文章:

java - CreateProcessW 失败 (ACCESS_DENIED)

java - 使用 jsp 和 servlet 的聊天应用程序

java - 我如何使抽象类与 JAXB 一起工作

java - 创建 jar 文件

android - 导入后我的外部 JAR 文件库未显示在 'External Libraries' 中

java - 子类的解码结果不正确

android - 访问权限文件

c# - FileStream 和 System.IO.File 方法之间的文件访问差异

c++ - 将矩阵写入文件

scala - 已编译 jar 与 Scala 和 Spark 的兼容性问题