【问题标题】:How to pass 'unsafe' arguments to the JVM of a Java Webstart application如何将“不安全”参数传递给 Java Webstart 应用程序的 JVM
【发布时间】:2023-10-28 14:26:02
【问题描述】:

我的 Java Webstart 应用程序在受控的可信环境中运行。这是一个封闭的内部网络,我可以控制应用程序的启动方式。

如何将 JVM 参数传递给应用程序,即使它们被 JVM 视为“不安全”供 webstart 使用?

【问题讨论】:

    标签: java java-web-start jvm-arguments


    【解决方案1】:

    有几个选项可以将 JVM 参数传递给 webstart。

    1. 通过 JNLP 文件。
    2. 通过 JAVA_TOOL_OPTIONS 环境变量。
    3. 通过本地计算机上的部署设置。
    4. 通过 javaws 命令(我无法让它工作)。

    请注意,我已包含指向此文档的 java 8 版本的链接。所有这些想法都在其他 Java 版本中得到支持和记录,但是有时它们的工作方式略有不同,或者限制略有改变。

    通过 JNLP 文件。

    JNLP 通过 JNLP 文件支持许多 JVM 参数。有些可以通过直接设置完成,例如initial-heap-sizemax-heap-size。对于其他设置,可以使用java-vm-args

    JNLP File Syntax 文档为“此版本”列出了一些受支持的 java-vm-args,但不确定这是示例的 1.4+ 版本还是 JRE 8。我知道实际上支持一些未列出的设置,例如-XX:MaxGCPauseMillis 并激活 G1 垃圾收集器。您可以创建一个 JNLP,然后使用 jinfo -flag MaxGCPauseMillis <pid> 测试设置是否已正确传播。

    这是首选方法,因为它不需要对 JVM 进行任何直接控制。缺点是只支持被认为是“安全”的特定参数。

    通过 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 列出了将参数传递给 JVM 的 -J 选项,例如通过如下运行 JNLP:

    javaws -J-XX:SoftRefLRUPolicyMSPerMB=2000 <my jnlp>
    

    但是我无法通过它来实际设置 JVM 参数。

    【讨论】: