2016-10-20 9 views
1

ProcessBuilderは通常ProcessBuilderでメソッド/関数を実行する方法はありますか?

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

のように、外部プログラムを実行するために使用されている今、私は、次のような、ProcessBuilderを使用して機能を実行したい:ちょうど直接Fooを起動していない理由を不思議に思うかもしれ

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

? like

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()メソッドを自分で実装する必要があります。


しかし、それのすべてはあなたのためにあまりにも複雑であれば、私は、環境変数を設定するシェルスクリプトであなたの現在のアプリケーションをラップし、ちょうど同じVMに通話を開始すると思います。

関連する問題