我知道如何使用 Eclipse 调试远程 Java VM,但如何使用 Java Web Start 程序进行调试。我有一个仅在 Java Web Start 中出现的问题。它必须与安全相关。
我需要一个适用于当前 Java VM(如 1.6.0_12)的解决方案。
我知道如何使用 Eclipse 调试远程 Java VM,但如何使用 Java Web Start 程序进行调试。我有一个仅在 Java Web Start 中出现的问题。它必须与安全相关。
我需要一个适用于当前 Java VM(如 1.6.0_12)的解决方案。
这与您想要远程调试的任何其他 Java 进程完全相同:您必须为 VM ( -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=12345
) 设置一些参数,然后连接到给定的端口。在 Java webstart 6.0 中,这可以使用 -J 选项来完成,在早期版本中,通过环境变量 JAVAWS_VM_ARGS。在此处查看详细信息。
手动启动 JWS VM。这样您就可以提供启动参数来打开调试端口。这是一个描述,它是这样的:
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
至于较新版本的 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 系统变量。
您还可以使用 -J 选项为 javaws 可执行文件提供调试参数
例子:
javaws.exe -J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 http://server:port/descriptor.jnlp
您将需要执行以下操作:
启用调试 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 Control Panel > Java > View 中为 JVM添加参数(即-Djavax.net.debug=all
)(这在本例中不是必需的),并从浏览器启动 JNLP 文件:
日志和跟踪位于Java 部署主页log
的目录中,我将这些位置粘贴到该目录中:
一种。视窗XP:%HOME%\Application Data\Sun\Java\Deployment
湾。视窗 7/Vista:%APPDATA%\..\LocalLow\Sun\Java\Deployment
C。Linux/Solaris:%HOME%/.java/deployment
使用 javax.net.debug=all 如果 jnlp 中的 jar 是从 https 连接加载的,您将看到握手。这类问题很难调试。
...
%% 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:
要在 Linux 中调试 Web Start 应用程序,请在调试模式下使用 javaws 调用创建一个 shell 脚本 ~/bin/javaws-debug.sh,如上所述:
~/bin/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,添加一个新的应用程序,从“为应用程序/x-java 选择应用程序”中选择 ~/bin/javaws-debug.sh -jnlp 文件”对话框。
配置好浏览器后,Java Web Start 应用程序将开始使用您的包装器,这将使调试器能够连接到端口 8989。
在 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
您可以在启用调试的情况下运行 JNLP:
javaws -Xnosplash -J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5009 <application>.jnlp
输出: 在地址监听传输 dt_socket:5009
使用您最喜欢的 IDE 附加到此,我使用 IntelliJ IDEA Run>Attach to process
您是否尝试过打印调试日志?无论如何,这是一件有用的事情,并且在这种情况下可能会有所帮助。
如果您想要真正的调试,请参见此处: 如何在 WebStart 下调试?