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

时间:2014-01-03 16:54:12

标签: 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

我认为这没有错,因为调试器正确连接。唯一的问题是,我只能调试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

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

/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
....

当我打开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

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

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

<param name="java_arguments" value="-Djnlp.packEnabled=true -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8087">

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

java.lang.NoClassDefFoundError: netscape/javascript/JSException
at java.lang.Class.getDeclaredConstructors0(Native Method)

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

以某种方式可能:

  1. 为webstart应用和插件定义单独的jdwp端口?
  2. 同时收听两个端口?
  3. 选择使用哪个调试?
  4. 我在Linux上使用64位oracle JDK 1.7.0_45-b18和64位Firefox。

1 个答案:

答案 0 :(得分:1)

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

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

之后,参数仅传递给applet,调试工作。