Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调试JNLP启动的应用程序_Java_Swing_Debugging_Jnlp - Fatal编程技术网

Java 调试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

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

我读到,如果我的
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
    (工作正常,但我找不到任何异常或控制台输出)
  • 使用调试参数启动
    javaws
    ,并将IntelliJ调试器附加到它(也可以工作,但不提供任何输出)
那么,如何使用JNLP启动应用程序并获得输出(写入默认的输出流和错误流),就像使用普通桌面应用程序一样?

Solution#1-启用Java控制台并查找异常。 您可以通过Java控制面板来完成。切换到Advanced选项卡,并在Java控制台中确保选中Show Console

然后,运行应用程序并监视控制台中的异常。修复异常

解决方案#2-调试正在运行的应用程序(正确)。 按如下方式启动Web Start应用程序(适用于Java 1.6及更高版本):

如果使用早期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
当应用程序运行时:

  • 附加一个调试器(Eclipse将执行-使用Run=>Debug Configurations=>remoteJava应用程序,并在连接属性面板中输入在参数中传递给
    javaws
    (在本例中:
    8123
    )的端口
  • 窗口关闭
    方法中设置断点
  • 尝试关闭您的应用程序-Eclipse应该中断断点上的执行
  • 进入
    GameLoop.INSTANCE.stopLoop()
    方法查看挂起的位置/时间

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

    有时甚至控制台也不显示任何内容,例如TLS/SSL握手出现问题(即关闭通知或握手失败)。在这些情况下,您需要执行以下操作:

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

  • 启用调试Java和启动JNLP的参数,有两种方法:

    2.a.下载JNLP文件并从命令行执行它(在这种特殊情况下不需要
    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