java - programacion - ¿Por qué los argumentos de JVM comienzan con "-D"?
programacion en java ejemplos (4)
¿Por qué los arquitectos de Java no pudieron dejarnos simplemente hacer:
java -jar -myProp="Hello World" myProgram.jar
Podría funcionar hoy, pero suponga que en las próximas versiones de Java se presente un argumento -myProp
como una opción de JVM.
¿Cómo distinguir su -myProp
de la opción -myProp
JVM? De ninguna manera.
Por lo tanto, existe una razón obvia para usar -D
para definir las propiedades del sistema.
Como otro ejemplo, en lugar de -myProp
supongamos que su programa se basa en una propiedad del sistema -client
.
No se ejecutará:
java -jar -client="davidxxx" myProgram.jar
Tendrías un error de JVM como:
Opción no reconocida: -client = davidxxx
as -client
es una opción estándar de JVM que no espera ningún valor.
Pero si usa -D-client
, ahora está bien, ya que aquí -Dclient
se define como una propiedad del sistema que es distinta de la opción JVM estándar del -client
:
java -jar -D-client="davidxxx" myProgram.jar
O utilizando ambos:
java -jar -client -D-client="davidxxx" myProgram.jar
Para ir más lejos, no todos los argumentos de JVM comienzan con -D
. pero la mayoría de ellos tiene un prefijo ( -D
, -X
, -XX
) que permite de alguna manera definir espacios de nombres.
Tienes distintas categorías de argumentos JVM:
1. Opciones estándar ( -D
pero no solo).
Estas son las opciones más utilizadas que son compatibles con todas las implementaciones de la JVM.
Utiliza -D
para especificar las propiedades del sistema, pero la mayoría de ellas no tienen ningún prefijo: -showversion
, -showversion
, y así para ...
2. Opciones no estándar (prefijadas con -X
)
Estas opciones son opciones de propósito general que son específicas de la Máquina Virtual de Java HotSpot.
Por ejemplo: -Xmssize
, -Xmxsize
3. Opciones avanzadas de tiempo de ejecución (prefijadas con -XX
)
Estas opciones controlan el comportamiento en tiempo de ejecución de la Java HotSpot VM.
4. Opciones avanzadas del compilador JIT (prefijadas con -XX
)
Estas opciones controlan la compilación dinámica justo a tiempo (JIT) realizada por la Java HotSpot VM.
5. Opciones avanzadas de servicio (prefijadas con -XX
)
Estas opciones proporcionan la capacidad de recopilar información del sistema y realizar una depuración extensa.
6. Opciones avanzadas de recolección de basura (prefijadas con -XX
)
Estas opciones controlan cómo se realiza la recolección de basura (GC) en la Java HotSpot VM.
¿Por qué necesitamos prefijar los argumentos de JVM con -D
por ejemplo, al ejecutar un jar desde la línea de comandos? P.ej
java -jar -DmyProp="Hello World" myProgram.jar
se utiliza para ejecutar myProgram.jar
con el parámetro del sistema myProp
. Entonces, ¿por qué el líder -D
? ¿Por qué los arquitectos de Java no pudieron dejarnos simplemente hacer:
java -jar -myProp="Hello World" myProgram.jar
Espero una respuesta más allá de simplemente "Porque así es como es".
Pregunta extra: ¿Por qué la letra -D
en lugar de cualquier otra letra, representa algo?
"Definir". El significado es similar a una definición de preprocesador en C. La -D significa que la definición está en el contexto de la aplicación, y no en el contexto del intérprete de Java como cualquier otra opción antes del nombre del ejecutable.
El uso de la letra "D" no se explica específicamente en la documentación , pero el único uso es "definir" una clave en el mapa de propiedades del sistema, excepto por esta referencia:
La clase Sistema mantiene un objeto Propiedades que define la configuración del entorno de trabajo actual. Para más información sobre estas propiedades, vea Propiedades del sistema. El resto de esta sección explica cómo usar las propiedades para administrar la configuración de la aplicación.
Si no especifica nada como -myProp = "XYZ" significa que se pasa como un argumento al método principal del programa.
-D significa que puede usar este valor usando System.getProperty
-X se usa para argumentos de extensión como -Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp: transport = dt_socket, server = y, suspend = y, address = 8000
Sí, podrían haber intercambiado ... los personajes; pero estos caracteres se utilizan para especificar qué tipo de parámetro se pasa y quién es el consumidor.
Sin la -D
las propiedades entrarían en conflicto con las opciones normales de JVM. Por ejemplo, ¿cómo establecería la propiedad jar
?
Probablemente se eligió la -D
(solo puedo especular sobre eso) porque también se usa en el preprocesador de C para definir símbolos y, por lo tanto, era familiar para la mayoría de las personas.