如何将 'unsafe' 参数传递给 Java Webstart 应用程序的 JVM
How to pass 'unsafe' arguments to the JVM of a Java Webstart application
我的 Java Webstart 应用程序在受控的可信环境中运行。这是一个封闭的内部网络,我可以在其中控制应用程序的启动方式。
如何将 JVM 参数传递给应用程序,即使 JVM 认为它们 'unsecure' 供 webstart 使用?
有几个选项可以将 JVM 参数传递给 webstart。
- 通过 JNLP 文件。
- 通过JAVA_TOOL_OPTIONS环境变量。
- 通过本地计算机上的部署设置。
- 通过 javaws 命令(我无法让它工作)。
请注意,我已经包含指向本文档 java 8 版本的链接。所有这些想法都在其他 Java 版本中得到支持和记录,但有时它们的工作方式略有不同,或者限制略有变化。
通过 JNLP 文件。
JNLP 通过 JNLP 文件支持许多 JVM 参数。有些可以通过直接设置来完成,例如 initial-heap-size
和 max-heap-size
。对于其他设置,可以使用 java-vm-args
。
JNLP File Syntax 文档列出了 'this version' 的一些受支持的 java-vm-args 但是不确定那是示例的版本 1.4+
还是 JRE 8. 我知道一些未列出的设置实际上是支持的,例如 -XX:MaxGCPauseMillis
和激活 G1 垃圾收集器。您可以制作一个 JNLP,然后使用 jinfo -flag MaxGCPauseMillis <pid>
来测试设置是否已正确传播。
这是首选方法,因为它不需要对 JVM 进行任何直接控制。缺点是只支持被认为是 'safe'.
的特定参数
通过JAVA_TOOL_OPTIONS环境变量
当您使用 javaws
命令启动 Java Webstart 时,您可以使用 JAVA_TOOL_OPTIONS
在从该环境启动的所有 JVM 上设置您想要的任何参数。
所以在Linux中你可以设置一个不受支持的参数:
export JAVA_TOOL_OPTIONS=-XX:SoftRefLRUPolicyMSPerMB=2000
javaws <my jnlp>
请注意,这将影响使用此系统变量的所有 java 应用程序 运行。因此,为所有用户或特定用户设置此项时应格外小心。如上例仅针对单个应用程序设置此选项更安全。
这个解决方案的优点是你可以传递任何你想要的参数。缺点是它需要一种特定的方式来启动应用程序,或者一个非常广泛的设置。它还需要控制客户端系统。
通过本地计算机上的部署设置
您还可以通过更改 JVM 的部署设置来传递 JVM 参数。这可以通过 Java Control Panel 来完成,它允许您设置默认的运行时设置。
如果您想自动执行这些设置,您可以使用 deployment properties 文件。不幸的是,该文件的 JRE 特定部分未记录。手动调整此文件非常容易:
deployment.javaws.jre.0.args=-XX\:SoftRefLRUPolicyMSPerMB\=2000
自动化此文件时,您必须非常仔细地观察它是否包含所有检测到的 JVM 的这些设置,因此您必须确保更改正确的设置。这也将用于您系统上的所有 Webstart 和小程序。
通过 javaws 命令(我无法让它工作)
应该有另一种方法(除了 JAVA_TOOL_OPTIONS
方法)使用命令行更改参数。 javaws documentation 列出了 -J
选项以将参数传递给 JVM,例如通过 运行 你的 JNLP 如下:
javaws -J-XX:SoftRefLRUPolicyMSPerMB=2000 <my jnlp>
但是我无法真正设置 JVM 参数。
我的 Java Webstart 应用程序在受控的可信环境中运行。这是一个封闭的内部网络,我可以在其中控制应用程序的启动方式。
如何将 JVM 参数传递给应用程序,即使 JVM 认为它们 'unsecure' 供 webstart 使用?
有几个选项可以将 JVM 参数传递给 webstart。
- 通过 JNLP 文件。
- 通过JAVA_TOOL_OPTIONS环境变量。
- 通过本地计算机上的部署设置。
- 通过 javaws 命令(我无法让它工作)。
请注意,我已经包含指向本文档 java 8 版本的链接。所有这些想法都在其他 Java 版本中得到支持和记录,但有时它们的工作方式略有不同,或者限制略有变化。
通过 JNLP 文件。
JNLP 通过 JNLP 文件支持许多 JVM 参数。有些可以通过直接设置来完成,例如 initial-heap-size
和 max-heap-size
。对于其他设置,可以使用 java-vm-args
。
JNLP File Syntax 文档列出了 'this version' 的一些受支持的 java-vm-args 但是不确定那是示例的版本 1.4+
还是 JRE 8. 我知道一些未列出的设置实际上是支持的,例如 -XX:MaxGCPauseMillis
和激活 G1 垃圾收集器。您可以制作一个 JNLP,然后使用 jinfo -flag MaxGCPauseMillis <pid>
来测试设置是否已正确传播。
这是首选方法,因为它不需要对 JVM 进行任何直接控制。缺点是只支持被认为是 'safe'.
的特定参数通过JAVA_TOOL_OPTIONS环境变量
当您使用 javaws
命令启动 Java Webstart 时,您可以使用 JAVA_TOOL_OPTIONS
在从该环境启动的所有 JVM 上设置您想要的任何参数。
所以在Linux中你可以设置一个不受支持的参数:
export JAVA_TOOL_OPTIONS=-XX:SoftRefLRUPolicyMSPerMB=2000
javaws <my jnlp>
请注意,这将影响使用此系统变量的所有 java 应用程序 运行。因此,为所有用户或特定用户设置此项时应格外小心。如上例仅针对单个应用程序设置此选项更安全。
这个解决方案的优点是你可以传递任何你想要的参数。缺点是它需要一种特定的方式来启动应用程序,或者一个非常广泛的设置。它还需要控制客户端系统。
通过本地计算机上的部署设置
您还可以通过更改 JVM 的部署设置来传递 JVM 参数。这可以通过 Java Control Panel 来完成,它允许您设置默认的运行时设置。
如果您想自动执行这些设置,您可以使用 deployment properties 文件。不幸的是,该文件的 JRE 特定部分未记录。手动调整此文件非常容易:
deployment.javaws.jre.0.args=-XX\:SoftRefLRUPolicyMSPerMB\=2000
自动化此文件时,您必须非常仔细地观察它是否包含所有检测到的 JVM 的这些设置,因此您必须确保更改正确的设置。这也将用于您系统上的所有 Webstart 和小程序。
通过 javaws 命令(我无法让它工作)
应该有另一种方法(除了 JAVA_TOOL_OPTIONS
方法)使用命令行更改参数。 javaws documentation 列出了 -J
选项以将参数传递给 JVM,例如通过 运行 你的 JNLP 如下:
javaws -J-XX:SoftRefLRUPolicyMSPerMB=2000 <my jnlp>
但是我无法真正设置 JVM 参数。