9

我创建了一个 Java 桌面应用程序(使用 Swing),现在正试图通过使用 JNLP 从网络启动它来使其工作。当我从终端启动该应用程序时,它运行良好,但一旦我从 JNLP 启动它,它就不会关闭。我每次都必须手动终止该进程。

我读到如果我JFrameDISPOSE_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 启动应用程序并获取输出(写入默认输出和错误流),就像使用普通桌面应用程序一样?

4

3 回答 3

17

解决方案 #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()方法以查看它挂起的位置/时间。

不要期望在控制台中看到解决方案,只需使用调试器单步执行代码 - 如果应用程序挂起,它会告诉您在哪里。

于 2012-06-06T13:12:09.030 回答
2

有时甚至控制台都没有显示任何内容,例如当 TLS/SSL 握手出现问题时(即 close_notify 或 handshake_failure)。在这些情况下,您需要执行以下操作:

  1. 在 Java 控制面板 > 高级中启用 Java 日志和跟踪。 Java 控制面板:日志和跟踪

  2. 启用调试 Java 和启动 JNLP 的参数,有两种方法可以做到:

    2.a. 下载 JNLP 文件并从命令行执行它(SET在这种特殊情况下不需要该命令)。

    set JAVA_TOOL_OPTIONS=-Djavax.net.debug=all
    javaws -wait jnlp.jnlp
    

    2.b。在 Java Control Panel > Java > View 中为 JVM添加参数(即-Djavax.net.debug=all)(这在本例中不是必需的),并从浏览器启动 JNLP 文件:

    Java 控制面板:jvm 参数

  3. 日志和跟踪位于Java 部署主页log的目录中,我将这些位置粘贴到该目录中:

    一种。视窗XP:%HOME%\Application Data\Sun\Java\Deployment

    湾。视窗 7/Vista:%APPDATA%\..\LocalLow\Sun\Java\Deployment

    C。Linux/Solaris:%HOME%/.java/deployment

于 2017-08-03T16:51:56.043 回答
0

此答案是启用远程调试 (Windows) 的npe 答案的替代方法。

  • 进入控制面板;
  • 点击Java,打开Java控制面板;
  • 在 Java 控制面板中,转到 Java 选项卡,然后单击“查看”;
  • 这将打开一个包含已安装 Java 版本的窗口。在运行时参数上放“-Xdebug -Xrunjdwp:transport=dt_socket,address=8123,server=y,suspend=n”(如果您想在应用程序启动时进行调试,请将“suspend”更改为“y”,这将使应用程序停止,直到编辑器远程连接);

启用远程调试

之后,将您的编辑器配置为远程调试到配置的端口(在本例中为 localhost:8123)。

于 2020-02-07T11:34:24.457 回答