Java 调试JNLP启动的应用程序
我创建了一个Java桌面应用程序(使用Swing),现在正试图通过使用JNLP从网络上启动它来让它工作。当我从终端启动应用程序时,它工作正常,但一旦我从JNLP启动它,它就不会关闭。每次我都必须手动终止进程 我读到,如果我的Java 调试JNLP启动的应用程序,java,swing,debugging,jnlp,Java,Swing,Debugging,Jnlp,我创建了一个Java桌面应用程序(使用Swing),现在正试图通过使用JNLP从网络上启动它来让它工作。当我从终端启动应用程序时,它工作正常,但一旦我从JNLP启动它,它就不会关闭。每次我都必须手动终止进程 我读到,如果我的JFrame使用DISPOSE\u ON\u CLOSE作为默认关闭操作,可能会出现问题,但它没有。它在关闭时使用DO\u NOTHING\u(隐式)。另外,我在释放所有对象后显式调用System.exit(0): f = new JFrame("Pacman"); f.ad
JFrame
使用DISPOSE\u ON\u CLOSE
作为默认关闭操作,可能会出现问题,但它没有。它在关闭时使用DO\u NOTHING\u
(隐式)。另外,我在释放所有对象后显式调用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启动的正在运行的应用程序的控制台输出(例如堆栈跟踪)。以下是我尝试过的:
- 使用调试参数启动
,并连接javaws
(工作正常,但我找不到任何异常或控制台输出)jconsole
- 使用调试参数启动
,并将IntelliJ调试器附加到它(也可以工作,但不提供任何输出)javaws
set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=8123"
并通过以下方式运行应用程序:
javaws http://myserver.com/path/to/myapp.jnlp
当应用程序运行时:
javaws
(在本例中:8123
)的端口窗口关闭
方法中设置断点GameLoop.INSTANCE.stopLoop()
方法查看挂起的位置/时间不要期望在控制台中看到解决方案,只需使用调试器逐步完成代码-如果应用程序挂起,它将向您显示位置。有时甚至控制台也不显示任何内容,例如TLS/SSL握手出现问题(即关闭通知或握手失败)。在这些情况下,您需要执行以下操作:
SET
命令)
2.b.在Java控制面板>Java>视图中为JVM添加参数(即-Djavax.net.debug=all
)(在本例中不需要),并从浏览器启动JNLP文件:
log
目录中,我从中粘贴这些位置:
a、 Windows XP:%HOME%\Application Data\Sun\Java\Deployment
b、 Windows 7/Vista:%APPDATA%\..\LocalLow\Sun\Java\Deployment
c、 Linux/Solaris:%HOME%/.java/deployment
此答案是启用远程调试(Windows)的替代方法
- 进入控制面板
- 点击Java,打开Java控制面板
- 在Java控制面板内部,进入Java选项卡,点击“查看”
- 这将打开一个包含已安装java版本的窗口。在运行时参数put“-Xdebug-Xrunjdwp:transport=dt_socket,address=8123,server=y,suspend=n”(如果要在应用程序启动时进行调试,请将“suspend”更改为“y”,这将使应用程序停止,直到编辑器远程连接为止)
之后,将编辑器配置为远程调试到已配置的端口(本例中为localhost:8123)。我将使用
尝试{GameLoop.INSTANCE.stopLoop();}catch(异常e){e.printStackTrace();/*可能会弹出一个用于调试的JOptionPane*/}//关闭应用程序:System.exit(0)
你能发布GameLoop.INSTANCE.stopLoop()
的代码吗?从这个方法的名称来看,我认为可能有一个wait()
或Threa\join()
调用,由于某种原因会无限等待。调试此方法也是一个好主意。@npe我使用的不是线程
-类,而是executer框架。因此,没有join()
-或wait()
-调用。你可能会发现整个类(以及整个项目)@andrewhompson是他们真正没有其他方法可以做到这一点的(正常)?如果应用程序挂起,我不认为它会在相同的上下文中生成一个JOptionPane
。“难道他们真的没有其他方法可以做到这一点吗?”我从来没有暗示这是唯一的方法。这只是一种在关闭前暂停执行的“快速n脏”方法。您可以将堆栈跟踪元素转储到选项窗格。很好,我现在有一个例外。谢谢!新的Java版本真的需要Xnoagent选项吗?在使用解决方案#2中建议的选项启动javaws之后,使用Java7我的应用程序启动时,从eclipse启动调试器时,出现了无法连接到VM的错误。我指定了用于启动javaws的正确端口号(8123)。一个观察结果是,javaws在任务管理器中没有显示为进程,这在应用程序启动时让我感到惊讶。
javaws http://myserver.com/path/to/myapp.jnlp
set JAVA_TOOL_OPTIONS=-Djavax.net.debug=all
javaws -wait jnlp.jnlp