Pregunta

Utilizo Eclipse IDE para desarrollar, compilar y ejecutar mis proyectos Java.Hoy estoy intentando utilizar el java.io.Console clase para gestionar la salida y, lo que es más importante, la entrada del usuario.

El problema es ese System.console() devoluciones null cuando una aplicación se ejecuta "a través" de Eclipse.Eclipse ejecuta el programa en un proceso en segundo plano, en lugar de un proceso de nivel superior con la ventana de consola con la que estamos familiarizados.

¿Hay alguna manera de obligar a Eclipse a ejecutar el programa como un proceso de nivel superior, o al menos crear una consola que la JVM reconozca?De lo contrario, me veo obligado a ejecutar el proyecto en un entorno de línea de comandos externo a Eclipse.

¿Fue útil?

Solución

Supongo que desea poder utilizar la depuración paso a paso desde Eclipse.Puede simplemente ejecutar las clases externamente configurando las clases construidas en los directorios bin en el classpath de JRE.

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

Puede depurar utilizando el depurador remoto y aprovechando los archivos de clase integrados en su proyecto.

En este ejemplo, la estructura del proyecto Eclipse tiene este aspecto:

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

1.Inicie la consola JVM en modo de depuración

depurar.bat es un archivo por lotes de Windows que debe ejecutarse externamente desde un cmd.exe consola.

@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

En los argumentos, el puerto de depuración se ha configurado en 8787.El suspender=y El argumento le dice a la JVM que espere hasta que se conecte el depurador.

2.Crear una configuración de inicio de depuración

En Eclipse, abra el cuadro de diálogo Depurar (Ejecutar > Abrir cuadro de diálogo de depuración...) y cree un nuevo Aplicación Java remota configuración con los siguientes ajustes:

  • Proyecto: el nombre de tu proyecto
  • Tipo de conección: Estándar (conexión de enchufe)
  • Anfitrión: servidor local
  • Puerto: 8787

3.Depuración

Entonces, todo lo que tienes que hacer cada vez que quieras depurar la aplicación es:

  • establecer un punto de ruptura
  • iniciar el archivo por lotes en una consola
  • iniciar la configuración de depuración

Puede realizar un seguimiento de este problema en error 122429.Puede solucionar este problema en su aplicación utilizando una capa de abstracción como se describe aquí.

Otros consejos

La solución que utilizo es simplemente usar System.in/System.out en lugar de Console cuando uso Eclipse.Por ejemplo, en lugar de:

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

Puedes usar:

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

La razón por la que esto ocurre es porque eclipse ejecuta su aplicación como un proceso en segundo plano y no como un proceso de nivel superior con una consola del sistema.

Puedes implementar una clase tú mismo.A continuación se muestra un ejemplo:

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

Encontré algo sobre esto en http://www.stupidjavatricks.com/?p=43 .

Y lamentablemente, dado que la consola es definitiva, no puede extenderla para crear un contenedor alrededor de system.in y system.out que tampoco lo haga.Incluso dentro de la consola eclipse todavía tienes acceso a ellos.Probablemente esa sea la razón por la que eclipse aún no ha conectado esto a su consola...

Entiendo por qué no querrías tener otra forma de obtener una consola que no sea System.console, sin configurador, pero no entiendo por qué no querrías que alguien pudiera anular la clase para crear una consola simulada/de prueba...

Otra opción es crear un método para resumir ambas opciones y realizar una "conmutación por error" al método System.in cuando la consola no esté disponible.El siguiente ejemplo es bastante básico: puede seguir el mismo proceso para resumir los otros métodos en la Consola (readPassword, formatear) según sea necesario.De esa manera, puede ejecutarlo felizmente en Eclipse y, cuando se implemente, obtendrá las funciones de la consola (p. ej.ocultación de contraseña) haciendo efecto.

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

Hasta donde puedo decir, no hay forma de obtener un objeto de consola de Eclipse.Solo me aseguraría de que la consola! = Nula, luego JAR y ejecutarlo desde la línea de comando.

Parece que no hay forma de obtener un objeto java.io.Console cuando se ejecuta una aplicación a través de Eclipse.No se abre una ventana de consola de línea de comandos con la aplicación, ya que se ejecuta como un proceso en segundo plano (¿en segundo plano para Eclipse?).Actualmente, no existe ningún complemento de Eclipse para manejar este problema, principalmente debido al hecho de que java.io.Console es una clase final.

Todo lo que realmente puede hacer es probar si el objeto de consola devuelto es nulo y continuar desde allí.

Este enlace ofrece alternativas al uso de System.console().Una es usar un BufferedReader envuelto alrededor de System.in, la segunda es usar un escáner envuelto alrededor de System.in.

Ninguno de los dos es tan conciso como el de la consola, ¡pero ambos funcionan en eclipse sin tener que recurrir a tonterías de depuración!

Supongamos que su espacio de trabajo Eclipse es C: MyWorkSpace, creó su aplicación Java dentro de un proyecto Maven MyProject, y su clase principal de Java es com.mydomain.mypackage.myclass.

En este caso, puede ejecutar su clase principal que usa System.console() en la línea de comando:

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

NB1:Si no está en un proyecto Maven, verifique la carpeta de salida en las propiedades del proyecto | Ruta de construcción de Java | Fuente.Puede que no sea "objetivo/clases"

NB2:si es un proyecto maven, pero su clase está en src/test/java, probablemente tendrá que usar "target est-classes" en lugar de "target\classes"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top