Java 修改正在执行的Jar文件

Java 修改正在执行的Jar文件,java,file-io,jar,classloader,executable-jar,Java,File Io,Jar,Classloader,Executable Jar,朋友们好。我有一个简单的问题,我担心没有一个简单的解决方案,我需要关于如何继续的建议。我正在开发一个打包为JAR和可执行JAR的java应用程序,但它需要在执行期间修改一些JAR文件内容。在这个阶段,我遇到了一个问题,因为一些操作系统锁定了文件,防止写入 在应用程序退出时,用户必须看到jar文件的更新版本,尽管我可以非常灵活地了解如何实现这一点。一个干净高效的解决方案显然是可取的,但可移植性是唯一的硬要求 以下是我可以看到的解决问题的三种方法,请随意评论或建议他人 告诉Java解锁JAR文件以便

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

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

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

  • 告诉Java解锁JAR文件以便编写(这似乎不可能,但这将是最简单的解决方案)
  • 在应用程序启动时,将可执行类文件复制到临时文件中,使用类加载器加载这些文件,并从初始JAR文件中卸载这些文件。(没有太多使用类加载器的经验,但希望JVM能够足够聪明地意识到原来的JAR不再使用,因此解锁它)
  • 将第二个可执行JAR文件放在第一个JAR文件中,启动时将内部JAR提取为临时文件,使用复制的内部JAR调用一个新的java进程,并将外部JAR的位置传递给它,第一个进程退出,第二个进程修改外部JAR而不受阻碍。(这会起作用,但我不确定是否存在一个java应用程序调用另一个应用程序的平台无关方式)
  • 我知道这是一个奇怪的问题,但如果有任何帮助,我们将不胜感激。

    一个选项:

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

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

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


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

    我真的认为您的方法是错误的。这根本不适合默认的部署java的方法。您修改的文件只需保存到某个db或xml文件中—这是唯一明智的方法


    任何事情都只是“迎风而战”-您可能会遇到一些困难,无法让它正常工作,但它最终会咬到您或客户。

    您能说明一下为什么需要在执行过程中修改jar文件吗?@pinkynobrain您的想法是老派的蚂蚁方式,我建议您阅读maven by example free电子书,您会发现您的建议毫无意义。。我很抱歉不是想冒犯你,只是想帮助你。我们不是都去过吗?你想实现什么-一个自我更新的应用程序?@c0mrade你指的是什么?JAR文件中捆绑了几个包含用户信息的文件,用户在程序执行过程中添加信息,这些信息必须添加到他是JAR文件。因为应用程序的目的是要小并且易于传输,我真的想把它保持为一个JAR文件。嘿,thx作为你的答案,这肯定是另一个解决方案,尽管它仍然与我的选项3有相同的问题。我想使用exec(“java”)是相当可移植的,我只是希望有一种真正独立于平台的方式从一个Java应用程序衍生出另一个Java应用程序。虽然Java比许多其他语言更独立于平台,但它在很多方面都不完美,而且在基于平台(如果它甚至需要不同-我认为“java”可以在unix和windows上工作,但不确定osx)。在实际调用之前,如何以平台
    独立
    的方式获取执行
    Runtime.getRuntime().exec()
    所需的所有信息。我认为
    System.getProperties()
    方法有一些有用的信息。很抱歉,您不喜欢这个答案。关于重命名、锁定等,我只是表达了我的观点,您试图强制一个不适合问题的解决方案。因此,这将是一个注释,而不是答案