Cómo pasar argumentos ‘no seguros’ a la JVM de una aplicación Java Webstart

Mi aplicación Java Webstart se ejecuta en un entorno de confianza controlado. Esta es una red interna cerrada donde tengo cierto control sobre cómo se inicia la aplicación.

¿Cómo puedo pasar los argumentos de JVM a la aplicación, incluso si se consideran “inseguros” para que los inicie la JVM?

Hay varias opciones para pasar los argumentos JVM a inicio web.

  1. A través del archivo JNLP.
  2. A través de la variable de entorno JAVA_TOOL_OPTIONS.
  3. A través de la configuración de implementación en el equipo local.
  4. A través del comando javaws (no pude hacer que esto funcionara).

Tenga en cuenta que he incluido enlaces a la versión java 8 de esta documentación. Todas estas ideas son compatibles y están documentadas en otras versiones de Java, sin embargo, a veces funcionan un poco diferente o tienen restricciones ligeramente modificadas.

A través del archivo JNLP.

El JNLP admite muchos argumentos JVM a través del archivo JNLP. Algunos se pueden hacer a través de configuraciones directas, como initial-heap-size max-heap-size . Para otras configuraciones se puede usar java-vm-args .

La documentación de la Sintaxis de archivos JNLP enumera algunos java-vm-args admitidos para “esta versión”, sin embargo, no está seguro de si esa es la versión 1.4+ del ejemplo, o JRE 8. Sé que algunas configuraciones no listadas son realmente compatibles, como -XX:MaxGCPauseMillis y activación del recolector de basura G1. Puede crear un JNLP y luego usar jinfo -flag MaxGCPauseMillis para comprobar si una configuración se ha propagado correctamente.

Este es el método preferido, ya que no requiere ningún control directo de la JVM. El inconveniente es que solo admite parámetros específicos que se consideran “seguros”.

A través de la variable de entorno JAVA_TOOL_OPTIONS

Cuando inicia Java javaws usando el comando javaws , puede usar JAVA_TOOL_OPTIONS para establecer cualquier parámetro que desee en todas las JVM iniciadas desde ese entorno.

Así que en Linux puedes hacer para establecer un parámetro no compatible:

 export JAVA_TOOL_OPTIONS=-XX:SoftRefLRUPolicyMSPerMB=2000 javaws  

Tenga en cuenta que esto afectará a todas las aplicaciones java ejecutadas con esta variable del sistema. Así que configurar esto para todos los usuarios, o un usuario específico debe hacerse con mucho cuidado. Configurar esto solo para una sola aplicación como el ejemplo anterior es mucho más seguro.

La ventaja de esta solución es que puede pasar cualquier parámetro que desee. El inconveniente es que requiere una forma específica de lanzar la aplicación o un entorno muy amplio. También requiere control sobre el sistema cliente.

A través de la configuración de despliegue en el equipo local.

También puede pasar argumentos de JVM cambiando la configuración de implementación de la JVM. Esto se puede hacer a través del Panel de control de Java , que le permite establecer la configuración de tiempo de ejecución predeterminada.

Si desea automatizar estas configuraciones, puede usar el archivo de propiedades de implementación . Desafortunadamente, la sección específica de JRE de este archivo no está documentada. Manualmente es muy fácil adaptar este archivo:

 deployment.javaws.jre.0.args=-XX\:SoftRefLRUPolicyMSPerMB\=2000 

Al automatizar este archivo, debe observar con mucho cuidado que contiene estas configuraciones para todas las JVM detectadas, por lo que debe asegurarse de cambiar la correcta. También se utilizará para todos los Webstart y applets en su sistema.

A través del comando javaws (no pude hacer que esto funcionara)

Debería haber otra forma (además del método JAVA_TOOL_OPTIONS ) para cambiar los parámetros usando la línea de comando. La documentación de javaws enumera la opción -J para pasar argumentos a la JVM, por ejemplo ejecutando su JNLP de la siguiente manera:

 javaws -J-XX:SoftRefLRUPolicyMSPerMB=2000  

Sin embargo, no he podido obtener esto para establecer realmente los parámetros de JVM.