Eclipse IDE中的java.io.Console支持
我使用EclipseIDE开发、编译和运行Java项目。今天,我尝试使用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
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
- 设置断点
- 在控制台中启动批处理文件
- 启动调试配置
您可以在中跟踪此问题。您可以在应用程序中通过使用所述的抽象层来解决这个问题。我使用的解决方法是在使用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错误