修改执行Jar文件

问题描述:

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

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

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

  1. 告诉Java解开的JAR文件写入(这似乎并不可能,但是这将是easyest溶液)
  2. 复制可执行的类文件,应用程序启动一个tempory文件,使用一个类加载器加载这些文件并从最初的JAR文件中卸载(对于类加载器没有太多经验,但希望JVM能够足够聪明地认识到原始JAR不再使用并解锁它)
  3. 放一秒可执行JAR文件首先在启动时将内部jar提取到临时文件,使用复制的内部JAR调用新的java进程并将其传递到外部JAR的位置,第一个进程(这将工作,但我不知道有一个Java应用程序调用另一个平*立的方式)

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

+3

你能否给出任何指示说明为什么你需要在执行过程中修改jar文件? – Poindexter 2010-03-17 16:03:08

+0

@pinkynobrain你在想老式的蚂蚁的方式,我建议你阅读maven的例子免费电子书,你会发现你的建议没有道理..我不想冒犯你只是想帮助你..有没有我们一直在那里 – ant 2010-03-17 16:10:33

+0

你想达到什么 - 一个自我更新的应用程序? – 2010-03-17 16:41:31

一个选项:

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

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

当您的程序退出(并进行更改)时,解压缩此实用程序并在其自己的JVM中启动它(使用Runtime.getRuntime().exec())。该公用设施将等待该锁从原始未修改的JAR上移开,然后开始其业务并退出。

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

+0

嗨,thx为你的答案,这是定义了另一种解决方案,虽然它仍然与我的选项3相同的问题仍然存在。我想使用exec(“java”)是公平的我只是希望有一些真正的平*立的方式来产生一个Java应用程序从另一个。 – PinkyNoBrain 2010-03-17 16:51:16

+0

虽然Java是比许多其他语言更平台无关,但它在很多方面是不完善的,它并不是真的那么大的一笔交易有一种类似于你执行jar文件的方式可以在基于平台的交换机上完成(如果它甚至需要不同 - 我认为'java '适用于unix和windows,不知道osx) – Chris 2010-03-17 17:13:54

+0

在实际的调用之前,获取所有需要以平台“独立”方式执行'Runtime.getRuntime()。exec()'的信息。我认为'System.getProperties()'方法有一些有用的信息通货膨胀。 – 2014-03-08 09:17:45

我诚实地认为你的方法是错误的。这根本不适合部署java的默认方式。你的修改过的文件只需要存放在某个地方的db或xml文件中 - 这是唯一明智的方法。

任何事情都只是“与风搏斗” - 你可能会有一些挣扎让它起作用,但它最终会咬你或者顾客。

+0

对不起,你不喜欢这个答案。在重命名,锁定等方面,我只是表达了我的观点,即您正试图强制一个不适合问题的解决方案。 – MJB 2010-03-19 19:55:51

+1

所以这将是一个评论,而不是一个答案 – 2014-03-08 09:18:35