2011-01-10 51 views
3

我有一個相當大的java程序,我們想讓它使用戶可以退出應用程序並以另一個用戶身份登錄。要做到這一點,我們想關閉應用程序並重新啓動它,以便向用戶顯示登錄對話框。問題是,該應用程序相當大,寫得不好。它有很多靜態變量可以保存某種狀態信息。理想情況下,我想重寫應用程序以處理這些可以全部清除的情況,但實際上我們需要儘快提供此功能。如何從java內重新啓動java程序?

我在想什麼最簡單的就是停下應用程序並開始一個新的虛擬機。然而,在關閉當前應用程序的同時停止並應用並啓動相同的應用程序似乎令人驚訝地困難。有沒有人有這樣的經驗?

編輯:我們正在追求使用Runtime.exec來再次調用同一個應用程序,但exec()想阻止,所以我們必須跳過箍環讓它在每個平臺(Windows,Mac,Linux)上工作。我更喜歡獨立於平臺的方式。

+0

可能重複[重新啓動Java應用程序。](http://stackoverflow.com/questions/4159802/restart-a-java-application) – 2011-01-10 18:01:20

+0

該問題有一個答案使用`ProcessBuilder`,這是建議在`Runtime.exex(cmdarray,envp,dir)`的文檔。 「ProcessBuilder.start()現在是使用修改後的環境啓動進程的首選方式。」 – 2011-01-10 18:13:45

+0

這應該是「Runtime.exec(...)」(不是「exex」)。 – 2011-01-15 01:30:59

回答

2

如果您可以修改代碼,也許可以退出程序並使用exec()方法使用Runtime類(java.lang.Runtime)再次啓動相同的程序(使用相同的參數?)。

http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html

編輯:也就是說,你第一次運行新的進程,然後退出程序。另一種方式當然會更困難或不可能(?)。 :)

1

如果您真的想停止JVM並重新啓動它,那麼您必須編寫一些包裝腳本(shell腳本或批處理文件,具體取決於您的操作系統)。您可以使用來自System.exit()的特殊返回碼來指示應該重新啓動應用程序。

而這可能是最好的辦法。你可以玩一些類加載器技巧,在其中創建一個自定義類加載器來加載應用程序的類。但是,有很多方法會出錯:例如,應用程序代碼可能會在某個隱藏位置調用System.exit(),或者它可能包含保留引導類加載器加載的類中的內部引用的代碼。

0

靜態成員與classloader:classname相關聯。您可以創建自己的類加載器並通過它實例化您的應用程序。然後,當你想重新啓動時,扔掉classloader並創建一個新類。這就是像JBoss這樣的應用程序引擎能夠即時重新加載應用程序的方式。

0

您可以使用RuntimeProcessBuilder重新啓動您的應用程序,但您可能必須稍微修改您的應用程序,因爲我非常確定您無法從JVM中檢索Java可執行文件完整路徑。

我建議你實現一個啓動器(作爲一個可執行文件或腳本)並使用java返回代碼來知道是否需要退出或者是否需要退出或重新啓動。