调试JNLP启动了应用程序

Luk*_*uth 8 java debugging jnlp swing

我创建了一个Java桌面应用程序(使用Swing),现在我尝试通过使用JNLP从网络启动它来使其工作.当我从终端启动它时,应用程序工作正常,但是一旦我从JNLP启动它,它就不会关闭.我每次都要手动杀死进程.

我读到如果我JFrame将其DISPOSE_ON_CLOSE用作默认关闭操作可能会出现问题,但事实并非如此.它使用DO_NOTHING_ON_CLOSE(隐含地).此外,我System.exit(0)在释放所有对象后明确调用:

f = new JFrame("Pacman");
f.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        // Terminate the Game-loop:
        GameLoop.INSTANCE.stopLoop();
        // Close the application:
        System.exit(0);
    }
});
Run Code Online (Sandbox Code Playgroud)

我想在关闭应用程序时可能会抛出一个异常,但我无法找到一种方法来获取正在运行的应用程序的控制台输出(例如Stack-Trace)以JNLP启动.这是我试过的:

  • javaws调试参数开始并连接jconsole(工作但我找不到任何异常或控制台输出).
  • javaws调试参数开始,并将IntelliJ调试器附加到它(也可以,但不会给我任何输出)

那么,我如何使用JNLP启动应用程序并获取输出(写入默认的输出和错误流),就好像我会使用普通的桌面应用程序一样?

npe*_*npe 14

解决方案#1 - 启用Java控制台,并查找异常.

您可以通过Java控制面板完成.切换到" 高级"选项卡,然后在Java控制台中确保选中" 显示控制台".

然后,运行您的应用程序并监视控制台的异常.修复异常.

解决方案#2 - 调试正在运行的应用程序(正确).

像这样启动Web Start应用程序(适用于Java 1.6及更高版本):

javaws -verbose -J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=8123 http://myserver.com/path/to/myapp.jnlp
Run Code Online (Sandbox Code Playgroud)

如果使用早期的java版本(1.4.2,1.5)设置环境变量,如下所示:

set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=8123"
Run Code Online (Sandbox Code Playgroud)

并运行应用程序:

javaws http://myserver.com/path/to/myapp.jnlp
Run Code Online (Sandbox Code Playgroud)

当应用运行时:

  1. 附加调试器(Eclipse将执行 - 使用Run => Debug Configurations => Remote Java Application,并在Connection Properties面板中输入参数传递的端口javaws(在本例中为:) 8123.
  2. windowClosing方法中设置断点.
  3. 尝试关闭应用程序 - Eclipse应该破坏断点上的执行
  4. 踏入GameLoop.INSTANCE.stopLoop()方法来查看何处/何时它挂起.

不要指望在控制台中看到解决方案,只需使用调试器逐步执行代码 - 如果应用程序挂起,它将显示在哪里.