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?
Antwort
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.
In welchen Fällen würde 'System.Console' tatsächlich nützlich sein? Ich kann nicht erwarten, dass der Benutzer niemals Streams umleiten wird. –
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. –
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 –
System.console() gibt null zurück, wenn Eingabe oder Ausgabe umgeleitet wird. Ant macht das einfach.
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.
Es sieht so aus, als ob der ant-Java-Task javaw.exe anstelle von java.exe verwendet. JavaW hat keine Konsole angeschlossen.
- 1. Ant wenn: wahr. Wenn die Eigenschaft auf "true" gesetzt wird, wird die Aufgabe nicht ausgeführt.
- 2. Warum kann ich keine Benutzereingaben erhalten, wenn Java mit ant ausgeführt wird?
- 3. Wie wird die Compiler-Ausgabe angezeigt, wenn javac über eine Ant-Task ausgeführt wird?
- 4. Das SSIS-Paket wird ausgeführt, wenn es manuell auf dem Server ausgeführt wird, aber bei der Ausführung über die Befehlszeile (dtexec) fehlschlägt
- 5. Warum wird ReflectionOnlyAssemblyResolve nicht ausgeführt, wenn Assembly.ReflectionOnlyLoad versucht wird?
- 6. Warum wird meine Vorlagenspezialisierung kompiliert, wenn sie nicht ausgeführt wird?
- 7. Javascript wird nicht ausgeführt, wenn ein JQuery-Dialogfeld beantwortet wird
- 8. Wenn in Web.config die Vertrauensstufe auf Hoch gesetzt wird, wird die Anwendung langsamer ausgeführt?
- 9. Warum wird HttpWebRequest.BeginGetResponse() synchron ausgeführt?
- 10. Warum verliert meine Benutzeroberfläche die Formatierung, wenn sie im Browser ausgeführt wird oder auf meinem Computer ausgeführt wird (Java Swing)?
- 11. WinForms UserControl wird bei der Ausführung abgeschnitten
- 12. Stoppen und Löschen von Docker-Container, wenn es ausgeführt wird
- 13. Warum wird hier sofort ausgeführt?
- 14. Befehl ausgeführt wird, nicht bei der Verwendung von Java
- 15. didReceiveRemoteNotification wird nicht ausgeführt, wenn App ausgeführt wird (FOREGROUND)
- 16. Warum wird SNMP normalerweise über UDP und nicht über TCP/IP ausgeführt?
- 17. NoClassDefFoundError bei der Ausführung von Test über Ant, aber Arbeit bei der Bereitstellung in Tomcat
- 18. Java - Warum wird meine statische Variable auf null gesetzt?
- 19. JUnit Test wird ausgeführt, wenn es nicht zu
- 20. Java JFrame-Fenster wird nicht angezeigt, wenn es von Eclipse ausgeführt wird
- 21. Warum wird CTE zweimal ausgeführt?
- 22. Warum wird UnitTestOutcome auf Unknown gesetzt, wenn Tests auf TeamCity ausgeführt werden?
- 23. Skript nicht ausführen, wenn es bereits ausgeführt wird
- 24. Warum wird setTimeout (.., 0) nicht sofort ausgeführt?
- 25. Akka Persistence: Wo wird die Ausführung des Befehls ausgeführt, wenn es nicht einfach eine Zustandsaktualisierung ist
- 26. Warum wird Zeile 17 dieses Java-Programms nicht ausgeführt?
- 27. Typüberprüfung, wenn Code ausgeführt wird
- 28. Media-Abfrage wird ausgeführt, nachdem es
- 29. Warum fehlt Lwjgl im Klassenpfad, wenn Gradle Run ausgeführt wird?
- 30. Warum wird dieser Ruby-Code ausgeführt, wenn der Test fehlschlägt?
Ich habe das gleiche Problem beim Start dieser Art von Programm in Emacs bemerkt. –