J'utilise l'IDE Eclipse pour développer, compiler et exécuter mes projets Java. Aujourd'hui, j'essaie d'utiliser la java.io.Console
classe pour gérer la sortie et, plus important encore, l'entrée utilisateur.
Le problème est que System.console()
revient null
lorsqu'une application est exécutée "via" Eclipse. Eclipse exécute le programme sur un processus en arrière-plan, plutôt qu'un processus de niveau supérieur avec la fenêtre de console que nous connaissons.
Existe-t-il un moyen de forcer Eclipse à exécuter le programme en tant que processus de niveau supérieur, ou au moins de créer une console que la JVM reconnaîtra? Sinon, je suis obligé de lancer le projet et de l'exécuter sur un environnement de ligne de commande externe à Eclipse.
System.out
etSystem.in
pour être suffisant pour mon cas d'utilisation et abandonné l'utilisationSystem.console()
.Réponses:
Je suppose que vous voulez pouvoir utiliser le débogage pas à pas d'Eclipse. Vous pouvez simplement exécuter les classes en externe en définissant les classes construites dans les répertoires bin sur le chemin de classe JRE.
Vous pouvez déboguer à l'aide du débogueur distant et en tirant parti des fichiers de classe intégrés à votre projet.
Dans cet exemple, la structure du projet Eclipse ressemble à ceci:
1. Démarrez la console JVM en mode débogage
debug.bat est un fichier de commandes Windows qui doit être exécuté en externe à partir d'une console cmd.exe .
Dans les arguments, le port de débogage a été défini sur 8787 . L' argument suspend = y indique à la JVM d'attendre que le débogueur se connecte.
2. Créez une configuration de lancement de débogage
Dans Eclipse, ouvrez la boîte de dialogue Débogage (Exécuter> Ouvrir la boîte de dialogue de débogage ...) et créez une nouvelle configuration d' application Java distante avec les paramètres suivants:
3. Débogage
Donc, tout ce que vous avez à faire à chaque fois que vous souhaitez déboguer l'application est:
Vous pouvez suivre ce problème dans le bogue 122429 . Vous pouvez contourner ce problème dans votre application en utilisant une couche d'abstraction comme décrit ici .
la source
pause
à la fin de ce fichier de commandes afin que vous puissiez voir tous les messages d'erreur qui clignotent avant sa fermeture.La solution de contournement que j'utilise consiste simplement à utiliser System.in/System.out au lieu de Console lors de l'utilisation d'Eclipse. Par exemple, au lieu de:
Vous pouvez utiliser:
la source
IOException
, qui n'est pas jeté en cas deConsole.readLine()
.La raison pour laquelle cela se produit est que eclipse exécute votre application en tant que processus d'arrière-plan et non en tant que processus de niveau supérieur avec une console système.
la source
Vous pouvez implémenter une classe vous-même. Voici un exemple:
la source
J'ai trouvé quelque chose à ce sujet sur http://www.stupidjavatricks.com/?p=43 .
Et malheureusement, puisque la console est définitive, vous ne pouvez pas l'étendre pour créer un wrapper autour de system.in et system.out qui le fait non plus. Même dans la console Eclipse, vous avez toujours accès à ceux-ci. C'est probablement pourquoi eclipse n'a pas encore branché cela sur leur console ...
Je comprends pourquoi vous ne voudriez pas avoir un autre moyen d'obtenir une console autre que System.console, sans setter, mais je ne comprends pas pourquoi vous ne voudriez pas que quelqu'un puisse remplacer la classe pour faire un maquette / console de test ...
la source
Une autre option consiste à créer une méthode pour encapsuler les deux options et à "basculer" vers la méthode System.in lorsque la console n'est pas disponible. L'exemple ci-dessous est assez basique - vous pouvez suivre le même processus pour résumer les autres méthodes dans la console (readPassword, format) si nécessaire. De cette façon, vous pouvez l'exécuter facilement dans Eclipse et une fois déployé, vous obtenez les fonctionnalités de la console (par exemple, le masquage de mot de passe).
la source
Pour autant que je sache, il n'y a aucun moyen d'obtenir un objet Console d'Eclipse. Je m'assurerais juste que la console! = Null, puis la JAR et l'exécuterais à partir de la ligne de commande.
la source
Il semble qu'il n'y ait aucun moyen d'obtenir un objet java.io.Console lors de l'exécution d'une application via Eclipse. Une fenêtre de console de ligne de commande n'est pas ouverte avec l'application, car elle est exécutée en tant que processus d'arrière-plan (arrière-plan d'Eclipse?). Actuellement, il n'y a pas de plugin Eclipse pour gérer ce problème, principalement en raison du fait que java.io.Console est une classe finale.
Tout ce que vous pouvez vraiment faire est de tester l'objet Console renvoyé pour null et de continuer à partir de là.
la source
Ce lien propose des alternatives à l'utilisation de System.console (). La première consiste à utiliser un BufferedReader enroulé autour de System.in, la seconde consiste à utiliser un Scanner enroulé autour de System.in.
Ni l'un ni l'autre ne sont aussi concis que la console, mais les deux fonctionnent en éclipse sans avoir à recourir à la bêtise de débogage!
la source
Supposons que votre espace de travail Eclipse soit C: \ MyWorkspace, vous avez créé votre application java dans un projet maven MyProject et votre classe principale Java est com.mydomain.mypackage.MyClass.
Dans ce cas, vous pouvez exécuter votre classe principale qui utilise
System.console()
sur la ligne de commande:NB1: si ce n'est pas dans un projet maven, vérifiez le dossier de sortie dans les propriétés du projet | Chemin de construction Java | La source. Ce n'est peut-être pas "cible / classes"
NB2: s'il s'agit d'un projet maven, mais que votre classe est dans src / test / java, vous devrez probablement utiliser "target \ test-classes" au lieu de "target \ classes"
la source