2009-07-29 10 views
4

Ich habe eine kleine Kommandozeilen-Anwendung in Java geschrieben und wollte dafür die neue Klasse java.io.Console verwenden. Ich verwende System.console(), um eine Instanz dieser Klasse zu erhalten. Dieser Aufruf gibt eine Arbeitskonsole zurück, wenn ich meine Anwendung über 'java -jar MyApp.jar' aufruft, aber nicht gesetzt ist, wenn ich die Anwendung über die Java-Task von ant ausführe. fork ist wahr und spwan false für diesen Aufruf. Warum ist dieser Unterschied (System.out.print() funktioniert gut unter ant)? Wie kann ich eine Konsole auch verwenden, wenn ich meine App über ant starte?Warum wird System.console() bei Ausführung mit Java und Unset gesetzt, wenn es über ant ausgeführt wird?

+2

Ich habe das gleiche Problem beim Start dieser Art von Programm in Emacs bemerkt. –

Antwort

7

Die Javadoc this method heißt es:

Gibt die eindeutige Console-Objekt mit der aktuellen virtuellen Maschine Java zugeordnet, falls vorhanden.

Und die Dokumentation für den System.Console Klasse Zustand:

Ob eine virtuelle Maschine eine Konsole hat, ist abhängig von der zugrunde liegenden Plattform und auch von der Art und Weise, in der die virtuelle Maschine aufgerufen wird. Wenn die virtuelle Maschine über eine interaktive Befehlszeile gestartet wird, ohne die standardmäßigen Eingabe- und Ausgabeströme umzuleiten, wird ihre Konsole vorhanden sein und normalerweise mit der Tastatur und dem Bildschirm verbunden sein, von dem aus die virtuelle Maschine gestartet wurde. Wenn die virtuelle Maschine automatisch gestartet wird, z. B. von einem Hintergrundjob-Scheduler, hat sie normalerweise keine Konsole.

würde ich mir vorstellen, dass, wenn Ant Gabeln ein neues Java-Prozess es Standardausgabe umleitet.

+0

In welchen Fällen würde 'System.Console' tatsächlich nützlich sein? Ich kann nicht erwarten, dass der Benutzer niemals Streams umleiten wird. –

+0

Fälle, in denen Sie eine feinkörnige Fähigkeit zum Lesen/Schreiben in die Konsole haben möchten, beispielsweise wenn Sie eine Art Fluch-ähnliches Verhalten ausführen. Ich würde denken, dass Sie möchten, dass Ihre App überprüft, ob es null ist und zu einer anderen Art von Verhalten verzweigen, wenn die Ausgabe umgeleitet wird. –

+0

BTW, was ich gemeint habe, wenn ich "fluchähnliches Verhalten" sage: http://en.wikipedia.org/wiki/Curses_(programming_library) und http://en.wikipedia.org/wiki/Ncurses –

2

System.console() gibt null zurück, wenn Eingabe oder Ausgabe umgeleitet wird. Ant macht das einfach.

1

Nun, Ant ist ein Build-Automation-Tool. In der Regel haben interaktive Anwendungen in der Build-Automatisierung wenig oder gar keinen Platz. Daher ist es nicht völlig unerwartet, dass Sie keine Konsole erhalten, wenn Sie Aufgaben über ant ausführen.

0

Es sieht so aus, als ob der ant-Java-Task javaw.exe anstelle von java.exe verwendet. JavaW hat keine Konsole angeschlossen.

Verwandte Themen