Eclipse IDE中的java.io.Console支持

Eclipse IDE中的java.io.Console支持,java,eclipse,console,java-io,Java,Eclipse,Console,Java Io,我使用EclipseIDE开发、编译和运行Java项目。今天,我尝试使用java.io.Console类来管理输出,更重要的是,管理用户输入 问题是当应用程序“通过”Eclipse运行时,System.console()返回null。Eclipse在后台进程上运行该程序,而不是在我们熟悉的带有控制台窗口的顶级进程上运行 有没有办法强制Eclipse将程序作为顶级进程运行,或者至少创建一个JVM可以识别的控制台?否则,我将被迫启动项目并在Eclipse外部的命令行环境中运行。据我所知,没有办法从E

我使用EclipseIDE开发、编译和运行Java项目。今天,我尝试使用
java.io.Console
类来管理输出,更重要的是,管理用户输入

问题是当应用程序“通过”Eclipse运行时,
System.console()
返回
null
。Eclipse在后台进程上运行该程序,而不是在我们熟悉的带有控制台窗口的顶级进程上运行


有没有办法强制Eclipse将程序作为顶级进程运行,或者至少创建一个JVM可以识别的控制台?否则,我将被迫启动项目并在Eclipse外部的命令行环境中运行。

据我所知,没有办法从Eclipse获取控制台对象。我只想确保那个控制台null,然后将其放入JAR并从命令行运行。

发生这种情况的原因是eclipse将应用程序作为后台进程运行,而不是作为带有系统控制台的顶级进程运行

在上找到了一些关于此的信息

不幸的是,由于控制台是最终的,所以您不能扩展它来创建一个围绕system.in和system.out的包装器,这也可以做到。即使在eclipse控制台中,您仍然可以访问这些。这可能就是为什么eclipse还没有将其插入控制台的原因


我理解为什么您不想用任何其他方式获得除System.console之外的控制台,而不使用setter,但我不理解为什么您不希望有人能够重写类来创建模拟/测试控制台

通过Eclipse运行应用程序时,似乎无法获取java.io.Console对象。命令行控制台窗口不会随应用程序一起打开,因为它是作为后台进程运行的(后台到Eclipse?)。目前,没有Eclipse插件来处理这个问题,主要是因为java.io.Console是最后一个类


您真正能做的就是测试返回的Console对象是否为null,然后从那里继续。

我假设您希望能够使用Eclipse中的逐步调试。通过在JRE类路径上的bin目录中设置内置类,您可以在外部运行这些类

java -cp workspace\p1\bin;workspace\p2\bin foo.Main
您可以使用远程调试器并利用项目中构建的类文件进行调试

在本例中,Eclipse项目结构如下所示:

workspace\project\
                 \.classpath
                 \.project
                 \debug.bat
                 \bin\Main.class
                 \src\Main.java
1。在调试模式下启动JVM控制台

debug.bat是一个Windows批处理文件,应该从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
在参数中,调试端口已设置为8787。suspend=y参数告诉JVM等待调试器连接

2。创建调试启动配置

在Eclipse中,打开调试对话框(运行>打开调试对话框…),并使用以下设置创建一个新的远程Java应用程序配置:

  • 项目:您的项目名称
  • 连接类型:标准(插座连接)
  • 主机:本地主机
  • 港口:8787
3。调试

因此,您需要在任何时候调试应用程序,只需执行以下操作:

  • 设置断点
  • 在控制台中启动批处理文件
  • 启动调试配置


您可以在中跟踪此问题。您可以在应用程序中通过使用所述的抽象层来解决这个问题。

我使用的解决方法是在使用Eclipse时只使用System.in/System.out而不是控制台。例如,而不是:

String line = System.console().readLine();
您可以使用:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();
这提供了使用System.console()的替代方法。一种是使用环绕System.in的BufferedReader,另一种是使用环绕System.in的扫描仪


两者都不如控制台那么简洁,但都可以在eclipse中工作,而不必求助于调试愚蠢

另一个选项是创建一个方法来包装这两个选项,并在控制台不可用时“故障转移”到System.in方法。下面的示例是一个相当基本的示例-您可以按照相同的过程在Console中根据需要总结其他方法(readPassword,format)。这样,您就可以在Eclipse中愉快地运行它&当它被部署时,您就可以使用控制台特性(例如密码隐藏)

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

您可以自己实现一个类。以下是一个例子:

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

假设您的Eclipse工作区是C:\MyWorkspace, 您在maven项目MyProject中创建了java应用程序, Java主类是com.mydomain.mypackage.MyClass

在这种情况下,您可以在命令行上运行使用
System.console()
的主类:

java -cp C:\MyWorkspace\MyProject\target\classes com.mydomain.mypackage.MyClass
NB1:如果它不在maven项目中,请检查项目属性| Java构建路径|源中的输出文件夹。它可能不是“目标/类”


NB2:如果它是一个maven项目,但您的类是src/test/java,那么您可能必须使用“target\test classes”而不是“target\classes”

我不认为您能够通过这种方式读取密码。。。。我们需要处理
IOException
,这在
Console.readLine()
的情况下是不会抛出的。我还将在批处理文件的末尾放置一个
暂停
,这样您就可以看到任何在关闭前闪烁的错误消息。这对我来说是最后一根稻草。如果为了调试而必须执行所有这些操作,我将切换回Netbeans。Eclipse中有这么多未修复的bug和UI烦恼,这一点都不好笑。@Nuzzolilo,这只是为了远程调试。您可以在eclipse中进行本地调试,而无需所有这些。另外,请参见我标识的
System.out
System.in
足以满足我的用例,并且可以使用
System.console()
。我将项目导出为可运行的jar,但仍然得到控制台null错误