8

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

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

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

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

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

4

2 回答 2

3

一种选择:

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

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

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

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

于 2010-03-17T16:23:01.160 回答
1

老实说,我认为你的方法是错误的。这根本不适合部署 java 的默认方式。您修改后的文件只需要保存到某个地方的 db 或 xml 文件 - 这是唯一明智的方法。

任何事情都只是“逆风而战”——你可能会费力地让它发挥作用,但它最终会咬你或客户。

于 2010-03-18T07:05:52.310 回答