2012-07-25 91 views
0

在我編寫的應用程序中,我使用Runtime.exec(...)啓動了另一個應用程序(可運行JAR)。一切都在Windows中成功啓動,但Linux(特別是某些CentOS安裝 - 在Ubuntu中工作)一直給我帶來一些問題。出於某種原因,輔助應用程序成功啓動的唯一方式是如果我通過終端執行第一個應用程序。所有行爲都按預期工作。但是,如果通過雙擊其圖標(未打開終端)啓動第一個應用程序,啓動第二個應用程序的按鈕似乎什麼也不做。我沒有得到任何異常或錯誤輸出 - 只是我的進度條閃現,說它正在啓動,然後什麼都沒有。我可以通過jconsole確認第二個應用程序的進程從未啓動。Linux中的運行時執行問題

我已經看到了關於執行方法(http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html)的陷阱的常見鏈接文章,但一直沒有能夠用我在那裏找到的任何東西解決這個問題。實際上,我正在讀取第二個進程的輸出和錯誤流,因爲當它成功運行時(通過終端命令啓動第一個應用程序之後),我看到了所有輸出。不知道有關Linux的更深層次的工作,我認爲這聽起來像是輸出流或權限問題,但我不確定。

在情況下,它可以幫助診斷問題,我使用下面的命令: rt.exec(new String[]{"\bin\bash", "-c", "java -jar myjarfile.jar myArg1 myArg2 ..."});由於該工程(根據不同的應用是如何啓動),我不是太擔心,什麼是錯的這一段代碼。 ..

任何人有任何建議嗎?提前致謝!

編輯:解決方案是修復目錄到我試圖運行的JAR。當通過GUI啓動時,user.dir指向包含我的應用程序的文件夾的父目錄。由於我使用Eclipse RCP,因此我的解決方案是使用 String currDirPath = Platform.getInstallLocation().getURL().toString();。感謝大家的幫助!

+0

這仍然可能是stdout/stderr流的問題。嘗試使用'popen'而不是'exec'並捕獲進程的輸出。 – 2012-07-25 11:48:04

+1

爲什麼不嘗試使用ProcessBuilder.start()而不是Runtime.exec()?前者總是可取的。 – 2012-07-25 12:42:48

+0

謝謝,夥計們。我會嘗試更新您的建議。 – FlammableChimp 2012-07-25 12:54:30

回答

2

既然你只是使用的jar文件名 - myJarFile.jar中 - 而不是完整路徑,根據當前的工作目錄,該罐可能會或可能不會被發現。嘗試更改您的exec命令以改爲使用jar的完整路徑。您可以使用rt.exec()將「pwd」的輸出寫入文本文件來進行調試。

+0

感謝您的輸入。我會調試,以確保,但我不認爲這是我的問題。在發佈我的代碼示例時,我忽略了我使用'String jarLoc = System.getProperty(「user.dir」)+「/myfolder/myjarfile.jar」;'根據工作目錄構建jar的絕對路徑。 – FlammableChimp 2012-07-25 12:55:24

+0

單擊圖標啓動程序時,當前工作目錄(「user.dir」)可能與您認爲的不同。 Rajesh和Jonathan – 2012-07-25 13:12:43

+0

- 非常有幫助!我意識到'user.dir'在通過GUI運行時指向包含文件夾的父目錄,而不是文件夾本身。解決這個問題解決了我的問題。 – FlammableChimp 2012-07-25 14:47:27

0

代替

rt.exec(new String[]{"\bin\bash", "-c", "java -jar myjarfile.jar myArg1 myArg2 ..."}); 

使用

rt.exec(new String[]{"\bin\bash", "-c", "/***path to java***/java -jar myjarfile.jar myArg1 myArg2 ..."});