Ich habe zwei Programme:
Der zweite Programmcode sieht so aus:
%Vor%Wenn die ersten Programme von Sekunde an beginnen, ist System.console () null und schlägt mit NPE fehl.
Die Frage ist also: Gibt es eine Möglichkeit, einen anderen Prozess mit System.console () verfügbar zu machen?
Die Antwort ist einfach: Wenn Sie Ihren Launcher von einer IDE wie Eclipse oder IntelliJ IDEA ausführen, hat er wahrscheinlich nicht System.console()
an erster Stelle, daher gibt es nichts, von dem der Subprozess erben kann. Versuchen Sie einfach etwas in System.console()
vom Launcher zu schreiben, es wird auch mit dem gleichen Fehler fehlschlagen. Wenn Sie jedoch Ihren Launcher über eine interaktive Konsole wie Cmd.exe oder Git Bash starten, können sowohl der Launcher als auch der über ProcessBuilder
gestartete Prozess in System.console()
schreiben. Ihr Launcher benötigt nicht einmal "cmd", "/c"
, es funktioniert mit oder ohne diese Parameter.
Konsolenprotokoll beim Start von IntelliJ IDEA:
%Vor%Konsolenprotokoll beim Start von cmd.exe:
%Vor%Fühlen Sie sich frei, irgendwelche Folgefragen zu stellen.
Update: Wenn es Ihnen nichts ausmacht, dass das externe Programm in einer eigenen interaktiven Konsole statt in der IDE-Konsole läuft, können Sie dazu den Windows-Befehl start
verwenden und dann entweder cmd /c
(Fenster wird sofort geschlossen, nachdem das externe Programm beendet wurde) oder cmd /k
(Fenster bleibt geöffnet, um das Ergebnis zu überprüfen):
Aber wenn Sie dann von / zu dieser Konsole lesen / schreiben wollen, sind Sie wieder bei Platz # 1. Sie haben gefragt, warum Sie System.console()
nicht auf einen Subprozess erben können. Nun, das liegt daran, dass es null
ist, weil Eclipse und IntelliJ Java-Programme aus der IDE starten (siehe [hier] für Hintergrundinformationen). Aber wie Magnus sagte, hast du immer noch System.{out|in}
und kannst sie wie folgt verwenden:
Tags und Links java process processbuilder