2011-11-23 70 views
5

我正在爲我的項目做一個更新功能,它工作的很好,直到我希望它重新啓動,基本上我下載了新文件並用舊的替換它,並且然後我想再次運行它,現在由於某種原因,不能做WNA跑了,我沒有得到任何錯誤...我如何在java中運行.jar文件

下面是完整的更新類: http://dl.dropbox.com/u/38414202/Update.txt

這裏是我使用的方法來運行我的.jar文件:

String currDir = new File("(CoN).jar").getAbsolutePath(); 
Process runManager = Runtime.getRuntime().exec("java -jar " + currDir); 
+0

你期待什麼後或運行這個罐子中? – maks

+0

您是否期望能夠退出當前的Java進程,並讓它被剛剛啓動的進程取代?鑑於Sun在Process類中提到的I/O限制,我不確定這是可能的。 –

+0

雖然我見過很多Java應用程序「自動更新」,所以必須有一些推薦的設計。 –

回答

0

這裏沒有一個似乎幫助了我,讓我去問問我的朋友和我有它差不多吧。它非常需要該字符串是一個數組。

解決方案:

String[] cmd = {"java", "-jar", currDir}; 
try { 
    Runtime.getRuntime().exec(cmd); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} 
0

JavaDocsProcess類特別指出,如果您未捕獲進程的輸出流,並及時讀取進程可能會停止。如果是這種情況,那麼你不會看到你開始運行的過程。

0

我認爲你必須捕捉stream這樣的:

BufferedReader stdInput = new BufferedReader(new InputStreamReader(runManager.getInputStream()),8*1024); 

BufferedReader stdError = new BufferedReader(new InputStreamReader(runManager.getErrorStream())); 

// read the output from the command 

String s = null; 
System.out.println("Here is the standard output of the command:\n"); 
while ((s = stdInput.readLine()) != null) { 
System.out.println(s); 
    } 
+0

我不確定你們是否瞭解我,我說過一切正常,直到我再次運行它時...爲什麼我需要輸入流?所有我想要做的就是運行.jar後,我已經取代了它, –

+0

@Wiggyboy當你的新jar文件運行時是否給出任何輸出? –

1

這我不清楚,你爲什麼需要運行與到exec()呼叫罐子。鑑於您需要從Java程序運行.jar文件中的代碼,您可以簡單地運行jar清單中定義的main()方法,並捕獲它的輸出 - 無論它在哪裏。

當您需要從底層操作系統調用程序時,使用exec()是可以的,但是如果調用者和被調用者都是Java程序,那麼有更簡單的方法可以做到這一點。

現在,如果你的jar會動態改變,你需要根據新的jar更新你的程序,有重新加載其內容的機制,例如看看這個其他post