调试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); } }); 

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

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

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

解决方案#1 – 启用Java控制台,并查找exception。

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

然后,运行您的应用程序并监视控制台以查找exception。 修复exception。

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

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

有时甚至控制台都没有显示任何内容,例如当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控制面板> Java> View中为JVM添加参数(即-Djavax.net.debug=all )(在此特定中不需要),并从浏览器启动JNLP文件:

    Java控制面板:jvm参数

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

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

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

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