2009-10-16 17 views
6

我使用Eclipse开发Java程序,并且认为如果没有参数,我会为程序添加一个选项来解析stdin。 (否则它解析文件)Java + Eclipse:如何调试正在接收管道/重定向stdin的java程序?

我遇到问题,如果我执行"somecommand | java -jar myjar.jar"并去调试......然后意识到我不知道如何在Eclipse中启动一个进程。如果我在命令提示符下运行它,我将无法附加到正在运行的进程,因为进程立即启动。

关于如何调试的任何建议?

编辑:看,事情是,我写我的程序最初采取文件名参数。然后我认为它也会对stdin有用,所以我做了抽象InputStream出我的程序(如Queue先生建议)。它在文件(java -jar myjar.jar myfile)上正常工作,但在运行type myfile | java -jar myjar.jar时无法运行。我怀疑在这两种情况下有什么不同(检测是不同的?),但我真的想调试。

// overall program structure follows: 

public static void doit(InputStream is) 
{ 
    ... 
} 

public static void main(String[] args) 
{ 
    if (args.length > 0) 
    { 
     // this leaves out the try-catch-finally block, 
     // but you get the idea. 
     FileInputStream fis = new FileInputStream(args[0]); 
     doit(fis); 
     fis.close(); 
    } 
    else 
    { 
     doit(System.in); 
    } 
} 
+0

会把你的Eclipse运行配置的参数做诡计吗? – javamonkey79 2009-10-16 22:49:37

+0

这些不是参数。这是事实,我必须在一些命令管道。 – 2009-10-16 23:15:26

回答

11

运行你的应用程序,在命令行上添加管道,但添加JVM参数以进行远程调试,如下所示:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044 

suspend=y会告诉JVM在连接调试器之前不会真正运行程序。

接下来,进入Eclipse调试启动配置(Run -> Debug Configurations...)并创建一个“远程Java应用程序”以连接到您的应用程序。在Eclipse中运行启动(在设置了一些断点之后),你应该能够进行调试。不是非常方便,但如果你不能在没有管道的情况下重现你的问题,这是一个选择。

+0

谢谢,这工作!现在要安全地扣上我的调试帽并继续前进:/ – 2009-10-20 14:35:52

+0

没问题。祝你好运! – 2009-10-20 20:24:07

4

如果我正在解释你的问题,我相信你只是想知道如何在标准中发送输入并在eclipse中通过它进行调试。

如果是简单输入,实际上可以在程序运行时通过eclipse控制台窗口手动输入System.in数据。只需在控制台窗口中输入内容,然后按回车键将文本发送到标准英寸。

如果它更复杂一些,我建议您抽取您正在尝试执行的读取InputStream的读取。在你的程序中,你可以发送System.in作为InputStream。要调试,您可以发送任何其他InputStream。例如,您可以将输入放入文件中,并将FileInputStream传递给该方法以对其进行测试。

编辑: 没有看到更多的代码,我不知道,但你可能会遇到一些与eof检测。一个FileInputStream有一个定义的文件结束,但我猜想System.in没有这种类型。你的读者可能只是在等待阅读下一个角色而不会前进。知道自己阅读“足够”后,您可能必须手动停止阅读。

+0

你的问题没错,但看到我的编辑(即将发布) – 2009-10-16 23:54:36

0

也许this solution创建命名管道可能适用于此处。

mkfifo foo 
somecommand > foo 

接下来的调试配置,添加< foo在指定参数时,让你的程序调试为:

Java的罐子myjar.jar <富

+1

不,因为据我所知,调试器不让我构建命令行“java -jar ...”(FWIW,if我理解的对,JVM已经在Eclipse中运行) – 2009-10-17 00:19:49