Question

J'utilise l'IDE Eclipse pour développer, compiler et exécuter mes projets Java. Aujourd'hui, j'essaie d'utiliser la classe java.io.Console pour gérer les sorties et, plus important encore, les entrées utilisateur.

Le problème est que System.console () renvoie null lorsqu'une application est exécutée " par le biais de " Éclipse. Eclipse exécute le programme sur un processus d'arrière-plan plutôt que sur un processus de niveau supérieur avec la fenêtre de console avec laquelle nous sommes familiers.

Existe-t-il un moyen de forcer Eclipse à exécuter le programme en tant que processus de niveau supérieur ou au moins à créer une console que la machine virtuelle Java reconnaîtra? Sinon, je suis obligé de lancer le projet dans un fichier jar et de l'exécuter sur un environnement de ligne de commande externe à Eclipse.

Était-ce utile?

La solution

Je suppose que vous souhaitez pouvoir utiliser le débogage étape par étape d'Eclipse. Vous pouvez simplement exécuter les classes en externe en définissant les classes construites dans les répertoires bin du chemin de classe JRE.

java -cp workspace\p1\bin;workspace\p2\bin foo.Main

Vous pouvez déboguer en utilisant le débogueur distant et en tirant parti des fichiers de classe intégrés à votre projet.

Dans cet exemple, la structure du projet Eclipse se présente comme suit:

workspace\project\
                 \.classpath
                 \.project
                 \debug.bat
                 \bin\Main.class
                 \src\Main.java

1. Démarrer 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 .

@ECHO OFF
SET A_PORT=8787
SET A_DBG=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=%A_PORT%,server=y,suspend=y
java.exe %A_DBG% -cp .\bin Main

Dans les arguments, le port de débogage a été défini sur 8787 . L'argument suspend = y indique à la machine virtuelle Java d'attendre que le débogueur se connecte.

2. Créer une configuration de lancement de débogage

Dans Eclipse, ouvrez la boîte de dialogue Débogage (Exécuter> gt; Ouvrir la boîte de dialogue Débogage ...) et créez une nouvelle configuration Application Java distante avec les paramètres suivants:

  • Projet: le nom de votre projet
  • Type de connexion: Standard (Socket Attach)
  • hôte: localhost
  • Port: 8787

3. Débogage

Ainsi, tout ce que vous avez à faire à tout moment pour déboguer l'application est:

  • définir un point d'arrêt
  • lancer le fichier de commandes dans une console
  • lancer la configuration de débogage

Vous pouvez suivre ce problème dans le bug 122429 . Vous pouvez résoudre ce problème dans votre application en utilisant une couche d'abstraction comme décrit ici .

Autres conseils

La solution de contournement que j'utilise consiste à utiliser uniquement System.in/System.out au lieu de la console lors de l'utilisation d'Eclipse. Par exemple, au lieu de:

String line = System.console().readLine();

Vous pouvez utiliser:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();

Cela s’explique par le fait qu’éclipse exécute votre application en tant que processus en arrière-plan et non pas en tant que processus de niveau supérieur avec une console système.

Vous pouvez implémenter une classe vous-même. Voici un exemple:

public class Console {
    BufferedReader br;
    PrintStream ps;

    public Console(){
        br = new BufferedReader(new InputStreamReader(System.in));
        ps = System.out;
    }

    public String readLine(String out){
        ps.format(out);
        try{
            return br.readLine();
        }catch(IOException e)
        {
            return null;
        }
    }
    public PrintStream format(String format, Object...objects){
        return ps.format(format, objects);
    }
}

Vous en saurez plus à ce sujet sur http://www.stupidjavatricks.com/?p=43 .

Et malheureusement, puisque la console est finale, 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 à l'intérieur de la console eclipse, vous avez toujours accès à ceux-ci. C’est probablement pour cette raison que Eclipse n’a pas encore branché cela dans leur console ...

Je comprends pourquoi vous ne voudriez pas avoir un autre moyen d'obtenir une console autre que System.console, sans aucun paramètre, mais je ne comprends pas pourquoi vous ne voudriez pas que quelqu'un puisse remplacer la classe. faire une maquette / une console de test ...

Une autre option consiste à créer une méthode pour regrouper les deux options et "basculer". à 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 de la console (readPassword, format) selon vos besoins. De cette façon, vous pourrez l’utiliser avec plaisir dans Eclipse & amp; lors de son déploiement, les fonctionnalités de la console (masquage de mot de passe, par exemple) entrent en jeu.

    private static String readLine(String prompt) {
        String line = null;
        Console c = System.console();
        if (c != null) {
             line = c.readLine(prompt);
        } else {
            System.out.print(prompt);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            try {
                 line = bufferedReader.readLine();
            } catch (IOException e) { 
                //Ignore    
            }
        }
        return line;
    }

Autant que je sache, il n’ya aucun moyen d’obtenir un objet Console auprès d’Eclipse. Je voudrais juste m'assurer que la console! = Null, puis le JAR et l'exécuter à partir de la ligne de commande.

Il semble n'y avoir aucun moyen d'obtenir un objet java.io.Console lors de l'exécution d'une application via Eclipse. Une fenêtre de la console de ligne de commande n'est pas ouverte avec l'application, car elle est exécutée en tant que processus en arrière-plan (l'arrière-plan d'Eclipse?). Il n’existe actuellement aucun plugin Eclipse pour traiter 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 la valeur null de l'objet Console renvoyé et de continuer à partir de là.

Cette lien offre des alternatives à System.console (). La première consiste à utiliser un BufferedReader enroulé autour de System.in, la seconde consiste à utiliser un scanneur 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 au débogage de la bêtise!

Supposons que votre espace de travail Eclipse est 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 utilisant System.console () sur la ligne de commande:

java -cp C:\MyWorkspace\MyProject\target\classes com.mydomain.mypackage.MyClass

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. Il se peut que ce ne soit pas "cible / classes"

NB2: s’il s’agit d’un projet maven, mais que votre classe est en src / test / java, vous devrez probablement utiliser " cible \ test-classes " au lieu de "cible \ classes"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top