¿Cuál es la diferencia entre JDK_JAVA_OPTIONS y JAVA_TOOL_OPTIONS cuando se usa Java 11?
¿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_OPTIONS
tener 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_OPTIONS
se 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.
JDK_JAVA_OPTIONS
solo lo selecciona eljava
iniciador, 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_OPTIONS
también lo recogen otras herramientas de Java,jar
porjavac
lo que debe usarse para las marcas que desee aplicar (y que sean válidas) a todas esas herramientas de Java.
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:
Las dos variables parecen implementarse en diferentes puntos del proceso de lanzamiento.
La
JDK_JAVA_OPTIONS
documentació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_OPTIONS
tiene prioridad, en parte por la misma razón.