你好 Stack Overflow 的 friend 们。我有一个简单的问题,我担心没有简单的解决方案,我需要有关如何进行的建议。我正在开发一个打包为可执行 JAR 的 java 应用程序,但它需要在执行期间修改其某些 JAR 文件内容。在这个阶段我遇到了一个问题,因为一些操作系统锁定了文件以防止写入它。
在应用程序退出时,用户必须看到更新版本的 jar 文件,尽管我可以非常灵活地实现这一点。干净高效的解决方案显然是可取的,但可移植性是唯一的硬性要求。
以下是我可以看到的解决问题的三种方法,请随时发表评论或提出其他建议。
- 告诉 Java 解锁 JAR 文件以进行写入(这似乎不可能,但这是最简单的解决方案)
- 在应用程序启动时将可执行类文件复制到临时文件,使用类加载器加载这些文件并从初始 JAR 文件中卸载这些文件。(对类加载器没有太多经验,但希望 JVM 会变得聪明足以意识到原始 JAR 不再使用并解锁它)
- 将第二个可执行 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/