2014-04-18 30 views
2

我在開發Eclipse插件時遇到了Java的ProcessBuilder問題。 我在調用start()方法之前正確地設置了環境,但是當我運行該程序時,它總是返回一個未找到命令的錯誤。Java ProcessBuilder:環境設置正確,但仍然沒有找到命令

當我通過命令行調用命令時,它完美地工作。

當我根據需要用環境啓動eclipse時,找到該命令並且程序正常工作。

只有當我以編程方式設置環境時,程序將失敗。

以下是我有:

ProcessBuilder pb = new ProcessBuilder("my_command", file, output); 
Map<String, String> env = pb.environment(); 
env.put("PATH", env.get("PATH") + File.pathSeparator + env1 + File.pathSeparator + env2); 
Process p = pb.start(); 
... 

其中,env1env2是我想要添加到PATH變量的路徑...

什麼是錯誤的代碼?

預先感謝您!

回答

3

我認爲,您在ProcessBuilder上設置的環境只是傳遞給新過程的內容,而不是構建器本身使用的內容。嘗試設置您的Java進程的environment variables,然後嘗試啓動新進程。

編輯:

看到,它可能無法改變Java進程的環境,我相信你必須想出一些變通。

當你已經知道的路徑()你正在尋找你當然可以弄清楚的完整路徑來"my_command"自己,大概這樣:

String commandString; 

if (new File(env1 + "/my_command").isFile()) { 
    commandString = env1 + "/my_command"; 
} else 
if (new File(env2 + "/my_command").isFile()) { 
    commandString = env2 + "/my_command"; 
} 

ProcessBuilder pb = new ProcessBuilder(commandString, file, output); 

可能是不切實際不過,如果"my_command"可能已經在其中一個用戶的PATH元素中。

+0

感謝您的回覆。但我認爲這是不可能的,因爲我想添加到環境路徑中的路徑可能會在運行時被用戶添加...無論如何,如果我明白,System.getenv()不能在運行時修改。我錯了嗎? – pnpo

+0

感謝您的更新! – pnpo

+0

只有現在我已經看到你的回覆這個更新。實際上,在瞭解了ProcessBuilder的真實工作方式(我不得不說,它是基於您的第一個答案)之後,我自己也得出了相同的結論。因此,我們在調用'start()'之前設置的環境被傳遞給在啓動過程中執行的命令並且** not **被當前在JVM上運行的進程使用(它負責查找爲進程中的命令啓動)。 – pnpo

相關問題