2016-10-20 16 views
1

ProcessBuilder ist in der Regel externe Programme verwendet, wieGibt es eine Möglichkeit, eine Methode/Funktion in ProcessBuilder auszuführen?

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

Jetzt möchte ich eine Funktion auszuführen mit ProcessBuilder, wie zum Beispiel:

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

Sie sich vielleicht, warum direkt frage mich nur nicht Foo aufrufen? wie

Foo(param1, param2) 

Weil ich die Systemumgebung ändern möchte, wenn Sie Foo ausführen. Der einzige Weg, ich fand, ist ProcessBuilder zu verwenden:

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

Also, wenn ich frage mich, ich ProcessBuilder verwenden können eine Methode/Funktion des aktuellen Programms aufzurufen. Wenn Sie eine bessere Idee haben, die Systemumgebung beim Ausführen von Foo zu ändern, können Sie mir gerne einige Vorschläge machen.

Antwort

0

Das Ausführen eines gegabelten Java-Prozesses ist eine nicht-triviale Aufgabe. Es kann natürlich gemacht werden, wie die meisten Build-Systeme es tun, aber es ist nicht so einfach wie es scheinen mag. Es gibt viele Drachen, weil Sie eine vollständige Befehlszeile erstellen müssen, und das ist ziemlich schwierig, wenn es um scheußliche Dinge wie einen Klassenpfad geht.

Ich habe an einer Stelle eine Klasse namens ForkedRun entwickelt, die versucht, eine etwas freundlichere API dafür bereitzustellen. Ich habe es in Code-Demonstrationen für ein Gespräch verwendet, das ich about unit testing compilers and other similar madness gab. Ich habe immer geplant, es in eine Bibliothek umzuwandeln, aber leider hatte ich nie die Zeit.

Wie auch immer, die Klasse ist hier: ForkedRun. Fühlen Sie sich frei, es zu klonen oder zu stehlen.

Der Code, den Sie entlang der Linien von

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

wäre schreiben würde, aber Sie würden sich die .withEnv() Methode implementieren.


Aber wenn das alles für Dich zu kompliziert ist, würde ich Ihre aktuelle Anwendung in einem Shell-Skript wickeln, das das Umgebungsvariable setzt und nur den Anruf in der gleichen VM starten.

Verwandte Themen