2016-10-20 68 views
1

ProcessBuilder通常用於運行外部程序,就像有什麼辦法可以在ProcessBuilder中運行一個方法/函數嗎?

ProcessBuilder pb = new ProcessBuilder("command", "Arg1", "Arg2"); 

現在我想運行使用ProcessBuilder的功能,如:

ProcessBuilder pb = new ProcessBuilder(Foo, param1, param2); 

你可能想知道爲什麼不直接調用Foo?像

Foo(param1, param2) 

因爲我想在運行Foo時更改系統環境。我發現的唯一方法是使用ProcessBuilder

Map<String, String> env = pb.environment(); 
env.put("HADOOP_HOME", "/opt/hadoop"); 

所以我想知道如果我可以使用ProcessBuilder調用當前程序的方法/函數。如果您在運行Foo時更改了系統環境,請隨時給我一些建議。

回答

0

運行派生的Java進程是一項不平凡的任務。這顯然可以做到,因爲大多數構建系統都這樣做,但並不像看起來那麼容易。有很多龍,因爲你需要組裝一個完整的命令行,這很棘手,當涉及到像班級路徑這樣的討厭的東西時。

我曾經在一點上開發過一個名爲ForkedRun的類,它試圖在這個附近提供一個稍微友好的API。我用它在代碼示範中進行了一次我給about unit testing compilers and other similar madness的討論。我一直計劃把它變成一個圖書館,但唉,我從來沒有時間。

無論如何,班級在這裏:ForkedRun。隨意克隆或竊取它。

你必須寫會沿着

new ForkedRun(Foo.class) 
    .withArg("first argument") 
    .withArg("second argument") 
    .withEnv("key", "value") 
    .run(); 

行,但你必須自己實現.withEnv()方法的代碼。


但如果這一切對你太複雜了,我會在包裝一個shell腳本,設置環境變量和剛開始在同一個VM通話當前的應用程序。

相關問題