从控制台/命令窗口断开java应用程序[重复]
Posted
技术标签:
【中文标题】从控制台/命令窗口断开java应用程序[重复]【英文标题】:Disconnect java application from console/command window [duplicate] 【发布时间】:2010-12-02 20:22:19 【问题描述】:可能重复:Is there a way to the hide win32 launch console from a Java program (if possible without JNI)
当我在 Windows 上的批处理文件中运行我的 java swing 应用程序时,控制台/命令窗口在我的 java 应用程序运行时保持打开状态。这会在我的任务栏上创建一个我不想拥有的额外窗口。但是当我关闭命令窗口时,它会停止我的 java 应用程序。有没有办法(可能通过批处理文件或命令行参数或对我的应用程序的代码更改)在启动我的 Swing 应用程序并在我的应用程序仍在运行时关闭控制台窗口后退出 java.exe?
主要方法如下:
public static void main(String args[])
ApplContext applContext = new ApplContext();
Throwable error = null;
try
applContext.setUserConfigDir(args.length>0 ? args[0] : null);
applContext.loadData();
ApplTools.initLookAndFeel(Parameters.P_NIMBUS_LAF.of(applContext.getParameters()));
catch (Throwable e)
error = e;
// JWorkSheet is a JFrame.
new JWorkSheet(applContext, error).setVisible();
【问题讨论】:
我们可以看看你的代码的sn-p吗?最好是main方法。 另外,看看这个:***.com/questions/649634/… 这是这个问题的重复:***.com/questions/264687/… 【参考方案1】:理想情况下,您最终将在代码中的某处调用SwingUtilities.invokeLater(Runnable r)
。这会将您的 GUI 代码放入正确的线程中,并且您应该能够在主线程退出后关闭命令行。
这是我正在谈论的一个基本示例:
public static void main(String[] args)
SwingUtilities.invokeLater(new Runnable()
public void run()
JFrame yourWindow = new YourFrame();
yourWindow.createAndShow();
【讨论】:
虽然这是初始化 Swing UI 的正确方法,但当主线程退出时,控制台不会消失。它将一直保持到 java.exe 退出,也就是进程中最后一个非守护线程退出时。 可以在主线程退出后关闭一个控制台窗口。我猜这是解决不同窗口问题的不同方法。【参考方案2】:使用 javaw.exe
而不是 java 运行您的应用程序。如果您从 bat 文件运行,请将其与 start
命令结合使用:
> start javaw.exe -jar myapp.jar
在此模式下运行时,如果您依赖控制台进行任何调试,最好设置适当的日志记录或至少重定向输出流。例如,如果没有控制台,您将永远不会看到为未处理的异常打印的友好堆栈跟踪。
注意:java.exe
是一个 Windows 控制台 应用程序。因此,无论它是如何启动的,或者其中运行了哪些线程,都会为其分配一个控制台。这就是javaw.exe
存在的原因。
【讨论】:
GUI 一开始就不应该与主线程耦合。 我完全同意,但是UI是在主线程中初始化还是在UI线程中初始化与是否为Java进程构建和维护控制台无关。以上是关于从控制台/命令窗口断开java应用程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章
通过 devtools 控制台为 Angular 应用程序断开特定选项卡的热重载
奇怪的控制台消息 - 应用程序窗口应该在应用程序启动结束时有一个根视图控制器 [重复]