Dies ist eine Zusammenfassung einiger der anderen Antworten, die gegeben wurden. Die Java-Systemeigenschaften bieten genügend Informationen, um den Pfad zum Java-Befehl und den Klassenpfad auf eine, wie ich glaube, plattformunabhängige Weise zu ermitteln.
public final class JavaProcess {
private JavaProcess() {}
public static int exec(Class klass, List<String> args) throws IOException,
InterruptedException {
String javaHome = System.getProperty("java.home");
String javaBin = javaHome +
File.separator + "bin" +
File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = klass.getName();
List<String> command = new LinkedList<String>();
command.add(javaBin);
command.add("-cp");
command.add(classpath);
command.add(className);
if (args != null) {
command.addAll(args);
}
ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.inheritIO().start();
process.waitFor();
return process.exitValue();
}
}
Sie würden diese Methode wie folgt ausführen:
int status = JavaProcess.exec(MyClass.class, args);
Ich dachte, es machte Sinn, in der tatsächlichen Klasse statt der String-Darstellung des Namens übergeben, da die Klasse in den Klassenpfad sowieso für diese zu arbeiten hat.
1 Stimmen
Also, wenn ich Sie richtig verstehe, haben Sie mehrere Klassen mit main()-Methoden und Sie wollen sie in separaten Prozessen zu starten?
0 Stimmen
Wie wäre es, wenn Sie exec("java.exe", CLASS_TO_BE_EXECUTED.class.getName()) ?
0 Stimmen
Wie man Eingaben von einem Benutzer für eine Java-Klasse, die als Prozess läuft, der selbst von einem Java-Programm gestartet wird, mit etwas wie br.readLine() entgegennimmt
1 Stimmen
Ich stimme dem OP zu, es wäre schön, wenn wir die gesamte CLI-Schnittstelle umgehen könnten. Jemand sollte wirklich mit einer Wrapper-Klasse kommen, um das zu tun, so dass Anwendungsentwickler auf Geschäftslogik konzentrieren können.