设置默认的JVM参数以用于小程序启动

3

我正在尝试远程调试Java小程序,但无论如何似乎都不能使 -agentlib:jdwp JVM 参数生效。我已经尝试在特定JRE的Java控制面板中指定它,并且也尝试通过用于启动小程序的JNLP文件进行设置。

什么是正确的方法来设置小程序启动的JVM参数?特别是,用于远程调试。

5个回答

3

看了一个类似的SO问题,我发现了以下答案...

有时候为了调试一些与安全相关的东西,浏览器插件环境与appletviewer之间的差异太大了。以下是您可以采取的有效方法来调试浏览器中的applets:

1)获取二进制文件的调试信息

备份JRE_HOME/lib下的.jar文件

(下载并)安装与您的JRE版本相同的JDK。

将JDK_HOME/jre/lib中的.jar文件复制到JRE_HOME/lib

JDK中的文件包含编译时包括调试信息(源代码行号信息、变量名等),而JRE文件没有这些信息。

如果没有这个,您将无法有意义地步入调试器中的核心类代码。

2)启用Java插件的调试

转到Java控制面板/ Java / Java运行时设置/ 查看/ 用户/ 运行时参数

并添加选项以启用调试。类似于:

-Djava.compiler=NONE -Xnoagent -Xdebug -Xrunjdwp:transport=dt_socket,address=2502,server=y,suspend=n

有趣的选项是端口(这里使用2502,您可以使用几乎任何空闲端口,只需将其写下以备后用)和暂停 - 如果您需要调试applet启动、类加载等内容,请将其设置为“y”。这样,当您访问一个applet页面时,浏览器会似乎冻结,因为JVM立即被挂起等待调试器连接。

3) 使用您喜欢的IDE进行远程调试Java插件

例如,在Eclipse中,选择运行 / 调试配置... / 远程Java应用程序

点击“新建”按钮。

确保连接类型为“Socket Attach”,如果您的浏览器是本地的,则选择localhost作为主机,以及您之前选择的端口(在此示例中为2502)。

您可能需要在源代码选项卡上包含您的JDK中的src.zip,以便Java核心类源代码可用。

保存配置,一旦您的浏览器运行插件(无论JVM是否暂停),请运行远程调试器以连接到插件JVM,其中包含打开您的applet源码的项目。


谢谢分享!我已经或多或少地尝试过这个。控制台报告它得到了参数,但小程序既不暂停,也不响应调试器连接。 - Phoebe
我对这篇文章进行了编辑,澄清了如何使用7来操作,但它正在审核中,所以尚未出现。简短回答:尝试使用-Djava.compiler=NONE -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=2502。 - Phoebe
我刚刚尝试了一下,@Zach,但是似乎对我没有作用。至少你成功了,对吧? - 11101101b
2
是的!我已经让它工作了。我必须通过运行bin/javacpl.exe(而不是真正的控制面板)来设置JVM参数,如果suspend=n,则无法工作。如果suspend=y,则所有小程序都会停止,直到调试器连接为止。 - Phoebe
另一个有趣的事情是,由于我正在使用“新样式”JNLP小程序启动,我确实需要连接两个调试器——一个用于小程序启动器,另一个用于小程序本身。 - Phoebe
1
请查看我在SO上类似问题的回答。这是最新版本的插件JVM中刚刚发生的事情。简短的答案是,您可以为javaw.exe设置参数,但这些参数永远不会传递到实际在浏览器插件中运行的java.exe。您可以通过使用Process Explorer检查JVM进程来验证此操作。顺便说一句,我已经向Oracle报告了这个问题。 - Spanky Quigman

2

0

我有一个解决方法。似乎是JRE7_u21无法打开端口,无法挂起,并且jconsole VM摘要不显示在Java控制面板中配置的VM参数。

我降级到JRE7_u17,一切正常。我的Java控制面板中的VM参数字符串为:

 -agentlib:jdwp=transport=dt_socket,address=8889,server=y,suspend=y,quiet=n,timeout=10000  

它似乎可以在没有的情况下工作

 -Djava.compiler=NONE

什么都没用,甚至替换之前建议的lib文件夹也不行。我甚至尝试了一些注册表修改(更改路径)。


0

你是否绝对需要在浏览器中运行小程序?因为调试小程序的正常方式是使用appletviewer


根据JPDA文档(我假设你已经阅读了,基于你之前尝试的事情),你应该能够在Java控制面板中指定代理。我从未尝试过这个,而且文档声称你无法通过这种方式打断小程序启动(只能附加到正在运行的小程序),所以我只能祝你好运。

是的,小程序与 RAP 应用程序紧密耦合。它必须在浏览器中运行。 - Phoebe
我认为评论应该是答案,而答案应该是评论。 - Andrew Thompson

0

您可以使用JAVA_TOOL_OPTIONS环境变量来传递默认的JVM参数。它将把这些参数传递给在浏览器中运行的小程序(而不仅仅是小程序)。即使在Java 7u21及更高版本中,这种方法也能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接