使用 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 的情况下启动。
我有个小问题。我有一个 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 的情况下启动。