Java 基于Eclipse的应用程序在Windows命令行上的输出仅在管道化时可见(不直接在cmd中)

Java 基于Eclipse的应用程序在Windows命令行上的输出仅在管道化时可见(不直接在cmd中),java,eclipse,windows,cmd,stdout,Java,Eclipse,Windows,Cmd,Stdout,我们有一个基于Eclipse的Java应用程序(主类实现iaapplication),它是从Windows命令行启动的。它在System.out上的输出在启动它的命令窗口中不可见/不打印。尽管如此,当将输出管道化到更多时,输出是正常的。为什么 例如,考虑 HeloWord .exe < /代码>。在命令窗口中运行C:\>helloworld.exe时,应用程序只返回。但是当运行C:\>helloworld.exe | more时,屏幕显示 C:>helloworld.exe |更多 你好,世界

我们有一个基于Eclipse的Java应用程序(主类实现
iaapplication
),它是从Windows命令行启动的。它在
System.out
上的输出在启动它的命令窗口中不可见/不打印。尽管如此,当将输出管道化到
更多
时,输出是正常的。为什么

例如,考虑<代码> HeloWord .exe < /代码>。在命令窗口中运行

C:\>helloworld.exe
时,应用程序只返回。但是当运行
C:\>helloworld.exe | more
时,屏幕显示

C:>helloworld.exe |更多

你好,世界

C:>

在linux上,输出良好。如何在Windows上查看输出

一些需要的信息:

  • 应用程序相当大。我可能不能把它砍掉。输出是对
    System.out.prinln(“xxx”)的简单调用
  • Java版本
    1.8.0\u 60
    ,Eclipse
    3.6.2
  • 使用
    >std.txt 2>err.txt
    显示输出确实在标准输出上
  • 线端为CR/LF
.ini
文件如下

--launcher.suppressErrors
-vmargs
-Xms256m
-Xmx4096m
-Djava.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory
-Djava.library.path=plugins

可能是相关的?

您最好使用一个框架来处理日志,如


这更便于移植和维护。

在您的示例中,您似乎已经使用java代码创建了一个exe。我的猜测是,您用来创建exe的打包程序对输出目标进行了一些更改,因为它是java程序的包装程序。
试着创建一个jar,然后试着用java-jar helloworld.jar执行它。

字符串是不是要用stderr代替stdout?(或者相反,取决于你的预期行为)


您可以使用equinox launcher启动基于Eclipse RCP的应用程序,如下所示:

java -jar plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
当然,您必须找到在RCP应用程序中使用的equinox launcher的正确版本

这样您将看到控制台日志

您可以在此处阅读更多信息:


编辑:使用基于eclipse.exe的启动器时,您无法获取控制台日志的原因是,Windows上的eclipse.exe生成一个单独的进程,该进程会弹出另一个命令提示窗口。

如果您的应用程序是通过
eclipse.exe
启动的(没有连接控制台)将调用更改为使用
eclisec.exe
(附带控制台,请注意应用程序名称中的
c

谢谢。但它是一个现有的应用程序,我们的日志框架不会改变。由于管道输出是有效的,我怀疑Windows会向我们展示创建输出的代码部分。您的可执行文件旁边有helloworld.\u ini\u吗?哪个java版本?哪一个eclipse版本?
more
在行结束方面可能更宽松。也许你只是
\r
\n
。使用
…>out.txt 2>err.txt
使用程序员的编辑器(如记事本+)检查行尾。可能需要
flush()
,因为没有完成println,我曾经在基于Eclipse3.x的现成应用程序中遇到过类似的问题。当我让Eclipse使用java.exe而不是javaw.exe时,我只能看到Eclipse的输出和底层插件。但这样做的缺点是,当从图标调用程序时,总是显示一个额外的控制台窗口。除此之外,我们还创建了一个基于Java的包装器应用程序(有点夸张;-),它调用eclipse并显式设置传入和传出流,以便读取stdout和stderr输出。复制eclipse.exe并将其配置为以应用程序的形式启动部分代码stdour和stderr在控制台上不应该都可见吗?那么,为什么在管道中可以看到ouptut?但我会查的