如果有两个JVM启动,如何调试applet?

Nep*_*daj 5 java debugging applet java-web-start

我需要通过打开浏览器窗口来调试由另一个Java应用程序(webstart)启动的applet.它适用于旧版本的java,但是对于Java 1.7_45,调试仅适用于第一个JVM(即webstart应用程序).

我在jcontrol中使用这些参数:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086
Run Code Online (Sandbox Code Playgroud)

我认为这没有错,因为调试器正确连接.唯一的问题是,我只能调试webstart应用程序而不是之后运行的applet.

在webstart应用程序和applet的控制台中显示:

Java Plug-in 10.45.2.18
Using JRE version
1.7.0_45-b18 Java HotSpot(TM) 64-Bit Server VM
Run Code Online (Sandbox Code Playgroud)

JNLP java进程以agentlib我在jcontrol中设置的选项开始:

/usr/lib/jvm/java-7-oracle/jre/bin/java -Xmx512m -Xms128m 
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086 
-Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar 
-classpath /usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar 
-Djnlpx.vmargs="-Xmx512m -Xms128m 
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086" 
-Djnlpx.jvm=/usr/lib/jvm/java-7-oracle/jre/bin/java
....
Run Code Online (Sandbox Code Playgroud)

当我打开一个applet我想从这个webstart应用程序进行调试时,会打开firefox中的新选项卡并启动三个进程:

/opt/firefox/plugin-container /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libnpjp2.so -greomni /opt/firefox/omni.ja -appomni /opt/firefox/browser/omni.ja -appdir /opt/firefox/browser 13665 true plugin

/usr/lib/jvm/java-7-oracle/jre/bin/java -D__jvm_launched=8315888593 -D__applet_launched=8315738716 -Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar -Djava.class.path=/usr/lib/jvm/java-7-oracle/jre/classes -Dsun.awt.warmup=true sun.plugin2.main.client.PluginMain write_pipe_name=/tmp/.com.sun.deploy.net.socket.13900.6946726655044877700.AF_UNIX

/usr/lib/jvm/java-7-oracle/jre/bin/java -D__jvm_launched=8317712180 -D__applet_launched=8315738716 -Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar -Djava.class.path=/usr/lib/jvm/java-7-oracle/jre/classes -Djnlpx.session.data=/tmp/session6916520025949955515 -Dsun.awt.warmup=true sun.plugin2.main.client.PluginMain write_pipe_name=/tmp/.com.sun.deploy.net.socket.13900.3102318208570708149.AF_UNIX
Run Code Online (Sandbox Code Playgroud)

如您所见,调试端口不作为参数传递给执行applet的命令

我试图向applet标签添加新的调试参数(我已尝试过Xdebug和agentlib),但它什么也没做:

<param name="java_arguments" value="-Djnlp.packEnabled=true -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8087">
Run Code Online (Sandbox Code Playgroud)

我也试过使用appletviewer,在解决了pack200库的问题之后,我坚持这个例外:

java.lang.NoClassDefFoundError: netscape/javascript/JSException
at java.lang.Class.getDeclaredConstructors0(Native Method)
Run Code Online (Sandbox Code Playgroud)

但我不认为这是一个解决方案,因为appletviewer不能与pack200一起工作,我必须将重复的库添加到服务器.

是否有可能:

  1. 为webstart app和插件定义单独的jdwp端口?
  2. 同时听两个端口?
  3. 选择使用哪一个调试?

我在Linux上使用64位oracle JDK 1.7.0_45-b18和64位Firefox.

Nep*_*daj 1

这并不是真正的解决方案,但有一个解决我的问题的方法。

  • 清除jcontrol中的java参数
  • 启动网络启动应用程序
  • 再次添加java参数
  • 运行小程序

之后,参数仅传递给小程序并且调试工作。