50

我知道如何使用 Eclipse 调试远程 Java VM,但如何使用 Java Web Start 程序进行调试。我有一个仅在 Java Web Start 中出现的问题。它必须与安全相关。

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

4

9 回答 9

25

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

于 2009-03-26T15:06:17.127 回答
23

手动启动 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
于 2009-03-26T15:15:48.650 回答
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 系统变量。

于 2014-11-06T12:36:39.423 回答
9

您还可以使用 -J 选项为 javaws 可执行文件提供调试参数

例子:

javaws.exe -J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 http://server:port/descriptor.jnlp
于 2013-05-21T08:11:07.247 回答
4

您将需要执行以下操作:

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

  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 Control Panel > Java > View 中为 JVM添加参数(即-Djavax.net.debug=all)(这在本例中不是必需的),并从浏览器启动 JNLP 文件:

    Java 控制面板:jvm 参数

  3. 日志和跟踪位于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:
于 2017-08-07T17:13:11.910 回答
2

要在 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。

于 2013-06-14T16:49:50.763 回答
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
于 2017-07-12T00:12:54.237 回答
2

您可以在启用调试的情况下运行 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

于 2019-09-07T09:12:16.280 回答
1

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

如果您想要真正的调试,请参见此处: 如何在 WebStart 下调试?

于 2009-03-26T15:12:36.333 回答