如何在Java Web Start(JNLP)下调试应用程序?

时间:2009-03-26 14:35:51

标签: java debugging jnlp java-web-start

我知道如何用Eclipse调试远程Java VM,但是如何使用Java Web Start程序来完成它。我遇到的问题只出现在Java Web Start中。它必须与安全相关。

我需要一个适用于当前Java VM的解决方案,如1.6.0_12。

9 个答案:

答案 0 :(得分:24)

与您要远程调试的任何其他Java进程完全相同:您必须为VM(-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=12345 )设置一些参数,然后连接到给定端口。在Java webstart 6.0中,可以使用-J选项在早期版本中通过环境变量JAVAWS_VM_ARGS来完成。详情请见here

答案 1 :(得分:23)

手动启动JWS VM。这样您就可以提供启动参数来打开调试端口。这是一个description,它是这样的:

set JAVAWS_TRACE_NATIVE=1
set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n"
javaws http://server:port/descriptor.jnlp

答案 2 :(得分:15)

对于较新版本的Java(Java 8u20 +和Java 7u70 +),我遇到像-Xrunjdwp这样的参数不能直接传递,也不能使用JAVAWS_VM_ARGS。 信息 Rejecting attempt to specify insecure property: -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 开始出现在控制台输出中。

对我有用的唯一解决方案是将这些参数传递给JAVA_TOOL_OPTIONS系统变量。

答案 3 :(得分:9)

您还可以使用-J选项

为javaws可执行文件提供debug参数

示例:

javaws.exe -J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 http://server:port/descriptor.jnlp

答案 4 :(得分:4)

您需要执行以下操作:

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

  2. 启用调试Java的参数(可选但有用,即tls / ssl握手问题为close_notify或handshake_failure)&启动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

  4. 使用javax.net.debug = all,如果从https连接加载jnlp中的jar,您将看到握手。这类问题很难调试。

    ...
    %% No cached client session
    *** ClientHello, TLSv1.2
    ...
    ***
    ... 
    Java Web Start Main Thread, received EOFException: error
    Java Web Start Main Thread, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    Java Web Start Main Thread, SEND TLSv1.2 ALERT:  fatal, description = handshake_failure
    Java Web Start Main Thread, WRITE: TLSv1.2 Alert, length = 2
    Java Web Start Main Thread, called closeSocket()
    #### Java Web Start Error:
    

答案 5 :(得分:2)

使用Java 8和Windows 10,打开命令提示符(cmd.exe)并键入:

set JAVAWS_TRACE_NATIVE=1
set JAVA_TOOL_OPTIONS=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
javaws java-app.jnlp

答案 6 :(得分:1)

您是否尝试过打印调试日志?无论如何这都是有用的,在这种情况下可能会有所帮助。

如果您想要真正的调试,请参阅例如这里: How can I debug under WebStart?

答案 7 :(得分:1)

要在Linux中调试Web Start应用程序,请在调试模式下使用javaws调用创建一个shell脚本〜/ bin / javaws-debug.sh,如上所述:

〜/斌/ javaws-debug.sh:

#!/bin/sh
export JAVAWS_TRACE_NATIVE=1
export JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE 
  -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n"
javaws "$@"

然后,在浏览器中,选择该脚本作为要在jnlp文件上调用的应用程序。

例如,在Firefox中,转到编辑→首选项→应用程序,内容类型:Java Web Start,然后在操作中选择“使用其他”,并从“选择助手应用程序”对话框中选择脚本。在Chrome中,您需要更改Linux系统设置。在KDE中,转到系统设置→文件关联,已知类型:application:x-java-jnlp-file,添加一个新的Application,从“选择Application for application / x-java”中选择〜/ bin / javaws-debug.sh -jnlp-file“对话框。

配置完浏览器后,Java Web Start应用程序将开始使用您的包装器,这将使调试器能够在端口8989上连接。

答案 8 :(得分:1)

您可以在启用调试的情况下运行JNLP:

javaws -Xnosplash -J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5009 <application>.jnlp

输出: 收听地址为5009的运输dt_socket

通过您最喜欢的IDE附加此功能,我使用IntelliJ IDEA 运行>附加以处理