103 votes

Support de java.io.Console dans l'IDE Eclipse

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, surtout, les entrées des utilisateurs.

Le problème est que System.Console() renvoie null lorsqu'une application est exécutée "par" Eclipse. 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 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 mettre le projet en jar et de l'exécuter dans un environnement de ligne de commande externe à Eclipse.

Merci, Ross

50voto

McDowell Points 62645

Je suppose que vous voulez être en mesure d'utiliser le débogage pas à pas depuis Eclipse. Vous pouvez simplement exécuter les classes en externe en plaçant les classes construites dans les répertoires bin du classpath 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 construits dans votre projet.

Dans cet exemple, la structure du projet Eclipse ressemble à ceci :

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 batch Windows qui doit être exécuté de manière externe à partir d'un fichier cmd.exe console.

@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é réglé sur 8787 . El suspendre=y indique à la JVM d'attendre que le débogueur s'attache.

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

Dans Eclipse, ouvrez la boîte de dialogue Debug (Run > Open Debug Dialog...) et créez un nouveau fichier Application Java à distance avec les paramètres suivants :

  • Projet : le nom de votre projet
  • Type de connexion : Standard (prise de courant)
  • Hôte : localhost
  • Port : 8787

3. Débogage

Donc, tout ce que vous avez à faire à chaque fois que vous voulez déboguer l'application est :

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

Vous pouvez suivre ce problème dans bug 122429 . Vous pouvez contourner ce problème dans votre application en utilisant une couche d'abstraction, comme décrit ci-dessous aquí .

35voto

Laplie Points 2983

La solution de rechange que j'utilise est d'utiliser System.in/System.out au lieu de Console lorsque j'utilise 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();

5voto

Heath Borders Points 8067

La raison pour laquelle cela se produit est qu'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.

4voto

John Gardner Points 10882

J'ai trouvé quelque chose à ce sujet sur http://www.stupidjavatricks.com/?p=43 .

Et malheureusement, depuis que 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 aussi. Même à l'intérieur de la console Eclipse, vous avez toujours accès à ces éléments. C'est probablement la raison pour laquelle Eclipse n'a pas encore intégré cette fonctionnalité dans sa console...

Je comprends pourquoi vous ne voulez pas avoir un autre moyen d'obtenir une console autre que System.console, sans setter, mais je ne comprends pas pourquoi vous ne voulez pas que quelqu'un puisse surcharger la classe pour faire une console de simulation/test...

4voto

binarycube Points 91

Une autre option consiste à créer une méthode qui englobe les deux options, et à "basculer" vers la méthode System.in lorsque Console n'est pas disponible. L'exemple ci-dessous est assez basique - vous pouvez suivre le même processus pour envelopper les autres méthodes dans Console (readPassword, format) si nécessaire. De cette façon, vous pouvez l'exécuter sans problème dans Eclipse et, lorsqu'il est déployé, vous bénéficiez des fonctionnalités de Console (par exemple, le masquage du mot de passe).

    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;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X