¿Cuál es la diferencia entre JDK_JAVA_OPTIONS y JAVA_TOOL_OPTIONS cuando se usa Java 11?

Resuelto neu242 asked hace 6 años • 2 respuestas

¿Cuál es la diferencia exacta entre JDK_JAVA_OPTIONS y JAVA_TOOL_OPTIONS cuando se usa Java 11?

Estoy usando un pequeño programa de prueba:

public class Foo {
  public static final void main(String[] args) {
    System.out.println("arg: " + System.getProperty("arg"));
  }
}

Las dos variables de entorno parecen hacer lo mismo, pero el resultado es ligeramente diferente. Eso me hace creer que podrían tener diferentes casos de uso:

$ JDK_JAVA_OPTIONS="-Darg=jdk" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Darg
arg: jdk

$ JAVA_TOOL_OPTIONS="-Darg=tool" java Foo
Picked up JAVA_TOOL_OPTIONS: -Darg
arg: tool

$ JDK_JAVA_OPTIONS="illegalArg" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: illegalArg
Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS

$ JAVA_TOOL_OPTIONS="illegalArg" java Foo
Picked up JAVA_TOOL_OPTIONS: illegalArg
Unrecognized option: illegalArg
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Parece JDK_JAVA_OPTIONStener prioridad sobre JAVA_TOOL_OPTIONS:

$ JDK_JAVA_OPTIONS="-Darg=jdk" JAVA_TOOL_OPTIONS="-Darg=tool" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Darg=jdk
Picked up JAVA_TOOL_OPTIONS: -Darg=tool
arg: jdk

Pero al final gana la línea de comando:

$ JDK_JAVA_OPTIONS="-Darg=jdk" JAVA_TOOL_OPTIONS="-Darg=tool" java -Darg=cmd Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Darg=jdk
Picked up JAVA_TOOL_OPTIONS: -Darg=tool
arg: cmd

Sin embargo, al construir solo JAVA_TOOL_OPTIONSse lee:

$ JDK_JAVA_OPTIONS="-Darg=jdk" JAVA_TOOL_OPTIONS="-Darg=tool" javac Foo.java
Picked up JAVA_TOOL_OPTIONS: -Darg=tool

Actualmente estoy usando AdoptOpenJDK 11 compilación 28.

neu242 avatar Oct 25 '18 16:10 neu242
Aceptado
  • JDK_JAVA_OPTIONSsolo lo selecciona el javainiciador, así que úselo para las opciones que solo desea aplicar (o que solo tienen sentido) para el comando de inicio de Java. Esta variable también es nueva en JDK 9+ y será ignorada por versiones anteriores de JDK. Por lo tanto, es útil al migrar de versiones anteriores a 9+.
  • JAVA_TOOL_OPTIONStambién lo recogen otras herramientas de Java, jarpor javaclo que debe usarse para las marcas que desee aplicar (y que sean válidas) a todas esas herramientas de Java.
gjoranv avatar Oct 25 '2018 12:10 gjoranv

La diferencia funcional entre las dos variables se explica por la respuesta de @gjoranv.

Creo que las diferencias en el resultado se deben a lo siguiente:

  1. Las dos variables parecen implementarse en diferentes puntos del proceso de lanzamiento.

  2. La JDK_JAVA_OPTIONSdocumentación dice:

    Para mitigar el posible uso indebido del comportamiento JDK_JAVA_OPTIONS, las opciones que especifican la clase principal (como -jar) o hacen que el iniciador de Java salga sin ejecutar la clase principal (como -h) no están permitidas en la variable de entorno. Si alguna de estas opciones aparece en la variable de entorno, el iniciador cancelará con un mensaje de error.

    Esta línea:

     Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
    

    es el mensaje de error que advierte al usuario de un posible intento de causar caos a través de esa variable.

    Creo que eso JDK_JAVA_OPTIONStiene prioridad, en parte por la misma razón.

Stephen C avatar Oct 25 '2018 13:10 Stephen C