Eclipse IDE中的java.io.Console支持

我使用Eclipse IDE来开发,编译和运行我的Java项目。 今天,我试图使用java.io.Console类来pipe理输出,更重要的是用户input。

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

有没有办法强制Eclipse将程序作为顶级进程运行,或者至less创build一个JVM可以识别的控制台? 否则,我不得不将这个项目打包并运行在Eclipse外部的命令行环境中。

我假设您希望能够使用Eclipse的逐步debugging。 您可以通过在JRE类path的bin目录中设置构build的类来在外部运行这些类。

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

您可以使用远程debugging器进行debugging,并利用项目中构build的类文件。

在这个例子中,Eclipse项目结构如下所示:

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

1.在debugging模式下启动JVM控制台

debug.bat是一个Windowsbatch file,应该从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 

在参数中,debugging端口已被设置为8787suspend = y参数告诉JVM等待debugging器连接。

2.创build一个debugging启动configuration

在Eclipse中,打开“debugging”对话框(“运行”>“打开debugging对话框…”),并使用以下设置创build新的远程Java应用程序configuration:

  • 项目:您的项目名称
  • 连接types:标准(sockets连接)
  • 主机: localhost
  • 港口: 8787

3.debugging

所以,你所要做的任何事情你想要debugging的应用程序是:

  • 设置一个断点
  • 在控制台中启动batch file
  • 启动debuggingconfiguration

您可以在错误122429中跟踪此问题。 您可以使用此处所述的抽象层在应用程序中解决此问题。

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

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

您可以使用:

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

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

 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将您的应用程序作为后台进程运行,而不是作为系统控制台的顶级进程运行。

http://www.stupidjavatricks.com/?p=43find了一些关于这方面的信息; 。

可悲的是,由于控制台是最终的,你不能扩展它来创build一个围绕system.in和system.out的包装。 即使在eclipse控制台中,您仍然可以访问这些控制台。 这可能是为什么日食还没有插入到他们的控制台呢…

我明白为什么你不希望有任何其他方式获得一个控制台以外的System.console,没有setter,但我不明白为什么你不希望有人能够重写类做一个模拟/testing控制台…

另一个选项是创build一个方法来包装这两个选项,并在Console不可用时将其“故障转移”到System.in方法。 下面的例子是一个相当基本的例子 – 你可以按照需要按照相同的过程来包装Console(readPassword,format)中的其他方法。 这样,你可以在Eclipse中高兴地运行它,当它被部署时,你将获得控制台function(例如密码隐藏)。

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

据我所知,没有办法从Eclipse获取Console对象。 我只是确保console!= null,然后JAR它并从命令行运行它。

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

你所能做的就是testing返回的Console对象为null,然后从那里继续。

此链接提供了使用System.console()的替代方法。 一个是使用一个包裹在System.in中的BufferedReader,另一个是使用一个围绕System.in的扫描器。

既不像控制台那么简洁,但都在eclipse中工作,而不必诉诸于debugging愚蠢!

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

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

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

NB1:如果它不在Maven项目中,请检查项目属性|中的输出文件夹 Java构buildpath| 资源。 这可能不是“目标/课程”

NB2:如果它是一个maven项目,但是你的类在src / test / java中,你可能需要使用“target \ test-classes”而不是“target \ classes”