使用 JFrame 和控制台从 .bat 中的 java 程序执行

Executing from a java program from .bat with JFrame and console

我有个小问题。我有一个 java 程序,当它启动时创建一个 JFrame 并在另一个线程中执行一个进程。最后一个进程使用 "System.out.println" 将消息记录到标准输出。我想执行此 java 程序并查看 JFrame 但看不到控制台。我希望其他进程的日志转到一个文件。我在 .bat 文件中写了这条指令:

start javaw -jar InterceptorProcess.jar > logger.log 2>&1

但是,它不起作用。我看到了 JFrame,另一个进程是 运行,但消息不会发送到 "logger.log"。我必须在蝙蝠中做什么改变?不改变 java 程序可能是不可能的。

此致!

这是 java 程序的代码:

public class InterceptorProcess 
{


public static void main(String[] args) 
{
    FrameInterceptor frame = new FrameInterceptor();
    frame.setResizable(false);
    frame.setTitle("HELLO!");
    Image icon = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB_PRE);
    frame.setIconImage(icon);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    System.out.println("HELLO WORLD!");
}
}

它不起作用的原因是因为您将 start 命令的输出重定向到日志文件,而不是 java 程序。 start 命令实际上没有产生任何输出,因此您的日志文件是空的。

如果您从批处理文件中省略 start 命令而只使用 javaw ... 命令,则日志文件包含正确的内容。

出于您的目的,我认为甚至不需要 start 命令。

您可以使用 start 通过向命令添加 /B 开关来启用命令重定向,这实际上不会创建新的 window 来启动该过程。它的限制是 shell 将不再在 Ctrl+C 终止应用程序,但您的应用程序可以在必要时处理它。

来自start帮助:

B

      Start application without creating a new window. The
      application has ^C handling ignored. Unless the application
      enables ^C processing, ^Break is the only way to interrupt
      the application.

将命令更改为:

start /B javaw -jar InterceptorProcess.jar > logger.log 2>&1

你应该得到正确的日志内容。

虽然Ryan的回答说明了问题的原因,但是没有说明解决方法:

start javaw -jar InterceptorProcess.jar ^> logger.log 2^>^&1

start "" "javaw -jar InterceptorProcess.jar > logger.log 2>&1"

你明确地说 "I want to execute this java program and see the JFrame but not the console"。

也许您想要做的只是以不显示控制台的方式启动 .jar?如果是这样,只要您以正确的方式创建可执行文件.jar:

Create a manifest file and your jar file:
C:\mywork> echo Main-Class: InterceptorProcess >manifest.txt
C:\mywork> jar cvfm InterceptorProcess.jar manifest.txt *.class
or
C:\mywork> jar cvfe InterceptorProcess.jar InterceptorProcess *.class

as long as your Windows file assocation for .jar is ok,然后如果您双击它,它将在没有 shell 的情况下启动。