调试JNLP启动了应用程序

时间:2012-06-05 14:57:00

标签: java swing debugging jnlp

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

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

  • 使用调试参数启动javaws并与jconsole连接(有效,但我找不到任何例外或控制台输出)。
  • 使用调试参数启动javaws并将IntelliJ调试器附加到它(也可以,但不会给我任何输出)

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

3 个答案:

答案 0 :(得分: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

如果使用早期的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将执行 - 使用运行 => 调试配置 => 远程Java应用程序,并在连接属性面板将参数中传递的端口输入javaws(在本例中为8123)。
  2. windowClosing方法中设置断点。
  3. 尝试关闭应用程序 - Eclipse应该破坏断点上的执行
  4. 进入 GameLoop.INSTANCE.stopLoop()方法查看它挂起的位置/时间。
  5. 不要期望在控制台中看到解决方案,只需使用调试器逐步执行代码 - 如果应用程序挂起,它将显示在哪里。

答案 1 :(得分:1)

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

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

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

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

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

    2.b中。在Java控制面板中为JVM添加参数(即-Djavax.net.debug=all)> Java>查看(在此特定情况下不需要),并从浏览器启动JNLP文件:

    Java Control Panel: jvm arguments

  3. 日志和跟踪位于Java Deployment Homelog目录中,我将粘贴这些位置:

    一个。 Windows XP:%HOME%\Application Data\Sun\Java\Deployment

    湾Windows 7 / Vista:%APPDATA%\..\LocalLow\Sun\Java\Deployment

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

答案 2 :(得分:0)

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

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

Enabling remote debug

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