2010-03-17 163 views
8

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

回答

2

一個選項:

有程序寫入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

1

我誠實地認爲你的方法是錯誤的。這根本不適合部署java的默認方式。你的修改過的文件只需要存放在某個地方的db或xml文件中 - 這是唯一明智的方法。

任何事情都只是「與風搏鬥」 - 你可能會有一些掙扎讓它起作用,但它最終會咬你或者顧客。

+0

對不起,你不喜歡這個答案。在重命名,鎖定等方面,我只是表達了我的觀點,即您正試圖強制一個不適合問題的解決方案。 – MJB 2010-03-19 19:55:51

+1

所以這將是一個評論,而不是一個答案 – 2014-03-08 09:18:35