修改执行Jar文件

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

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

以下是我可以看到解决问题的三种方法,随意评论或建议其他方法。

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

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

一种选择:

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

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

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

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

老实说,我认为你的做法是错误的。 这根本不适合部署java的默认方式。 您修改过的文件只需要在某处持久保存到db或xml文件 – 这是唯一合理的方法。

任何事情都只是“与风作斗争” – 你可能会有些努力让它发挥作用,但它最终会咬你或客户。