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

vatpfxk5  于 2023-02-04  发布在  Java
关注(0)|答案(9)|浏览(168)

我知道如何使用Eclipse调试远程Java VM,但如何使用Java Web Start程序进行调试呢?我遇到了一个仅在Java Web Start中出现的问题,它一定与安全性相关。
我需要一个解决方案,将与当前的Java虚拟机如1.6.0_12。

2admgd59

2admgd591#

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

ohfgkhjo

ohfgkhjo2#

手动启动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
vulvrdjw

vulvrdjw3#

至于较新版本的Java(Java 8 u20+和Java 7 u 70+),我遇到了像-Xrunjdwp这样的参数不能直接传递,也不能使用JAVAWS_VM_ARGS。消息Rejecting attempt to specify insecure property: -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000开始显示在控制台输出中。
唯一对我有效的解决方案是将这些参数传递到JAVA_TOOL_OPTIONS系统变量中。

zy1mlcev

zy1mlcev4#

还可以使用-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
cu6pst1q

cu6pst1q5#

您将需要执行以下操作:
1.在Java控制面板〉高级中启用Java日志和跟踪。

1.启用调试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控制面板〉Java〉视图中为JVM添加参数(即-Djavax.net.debug=all)(在此特定情况下不需要),并从浏览器启动JNLP文件:

1.日志和跟踪位于Java部署主目录的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
使用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:
yacmzcpb

yacmzcpb6#

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

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

输出:侦听传输dt_socket地址:小行星50
使用您最喜欢的IDE附加到该进程,我使用IntelliJ IDEA运行〉附加到进程

11dmarpk

11dmarpk7#

使用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

之后,在Eclipse(或另一个IDE)中启动正常的远程Java应用程序调试,设置为上面命令中使用的端口(本例中为8000

jhiyze9q

jhiyze9q8#

要在Linux中调试Web Start应用程序,请创建一个shell脚本~/bin/javaws-debug.sh,其中javaws调用处于调试模式,如上所述:
~/binjavaws-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中,进入系统设置→文件关联,已知类型:应用程序:x-java-jnlp-file,添加新应用程序,javaws-debug.sh从“为应用程序/x-java-jnlp-file选择应用程序”对话框中选择~/bin/ www.example.com。
配置浏览器后,Java Web Start应用程序将使用 Package 启动,这将使调试器能够连接到端口8989。

2mbi3lxu

2mbi3lxu9#

你试过打印一个调试日志吗?无论如何,这是一个有用的东西,在这种情况下可能会有帮助。
如果你想要真实的的调试,请看例如这里:如何在WebStart下进行调试?

相关问题