调试JNLP启动的应用程序

发布于 2021-01-30 17:05:54

我创建了一个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);
    }
});

我猜想在关闭应用程序时可能会引发异常,但是我找不到从JNLP开始获取正在运行的应用程序的控制台输出(例如Stack-Trace)的方法。这是我尝试过的:

  • javaws调试参数开始并进行连接jconsole(可以,但是我找不到任何异常或控制台输出)。
  • javaws调试参数开始,并将IntelliJ调试器附加到它(也可以,但是没有任何输出)

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

关注者
0
被浏览
65
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    解决方案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
    

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

    set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=8123"
    

    并通过以下方式运行该应用程序:

    javaws http://myserver.com/path/to/myapp.jnlp
    

    应用运行时:

    1. 附加一个调试器(Eclipse会执行-使用 Run => Debug Configurations => Remote Java Application ,然后在 Connection Properties 面板中输入传递给参数的端口javaws(在本例中为8123)。
    2. 在您的windowClosing方法内设置一个断点。
    3. 尝试关闭您的应用程序-Eclipse应该在您的断点处中断执行
    4. 进入GameLoop.INSTANCE.stopLoop()方法以查看其挂起位置/时间。

    不要期望在控制台中看到解决方案,只需通过调试器逐步执行代码即可-如果应用程序挂起,它将向您显示位置。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看