Uso adecuado de los parámetros de línea de comandos de Java -D

4 minutos de lectura

avatar de usuario
ryan berger

Al pasar un parámetro -D en Java, ¿cuál es la forma correcta de escribir la línea de comandos y luego acceder a ella desde el código?

Por ejemplo, he intentado escribir algo como esto…

if (System.getProperty("test").equalsIgnoreCase("true"))
{
   //Do something
}

Y luego llamándolo así…

java -jar myApplication.jar -Dtest="true"

Pero recibo una NullPointerException. ¿Qué estoy haciendo mal?

  • Considere usar compareToIgnoreCase en vez de equalsIgnoreCase para identificadores independientes del entorno local; de lo contrario, puede encontrarse con el problema de las cuatro I turcas, entre otros.

    – Mc Dowell

    19 de febrero de 2011 a las 10:10

  • ¿Puedo sugerir usar Boolean.getBoolean en lugar de la declaración if larga que tiene? shankh.com/2009/07/07/un poco de diversión con boolean-getboolean

    – Marcos

    28 de diciembre de 2011 a las 7:31

  • ¿Qué significa -D significa?

    – Anshul

    18 de julio de 2019 a las 9:03

Sospecho que el problema es que has puesto la “-D” después la -jar. Prueba esto:

java -Dtest="true" -jar myApplication.jar

Desde la ayuda de la línea de comando:

java [-options] -jar jarfile [args...]

En otras palabras, la forma en que lo tienes en este momento tratará -Dtest="true" como uno de los argumentos a pasar a main en lugar de como un argumento JVM.

(Probablemente deberías además elimine las comillas, pero es posible que funcione de todos modos; probablemente dependa de su caparazón).

  • Funciona perfectamente ahora. También es interesante tener en cuenta que para replicar este comportamiento dentro del depurador de Eclipse, estos tipos de parámetros deben colocarse en la sección Argumentos de VM en Configuraciones de ejecución.

    –Ryan Berger

    18 de febrero de 2011 a las 19:52

  • al menos de intento funciona con las comillas allí (y también permite espacios de esta manera), lo uso todo el día para llamadas de hormigas.

    – Paŭlo Ebermann

    18 de febrero de 2011 a las 22:03

  • ¡Siéntete un poco estúpido por cuánto tiempo pasé en eso! Gracias por señalar eso. 🙂

    – toidiu

    13/08/2016 a las 22:00

  • en caso de que alguien se pregunte, si desea pasar varias propiedades, simplemente use -D varias veces después de un ‘espacio’ java -D= -D= -D=

    – Praveen Tiwari

    10 de octubre de 2018 a las 2:34

avatar de usuario
Alain Pannetier

Eso debería ser:

java -Dtest="true" -jar myApplication.jar

Entonces lo siguiente devolverá el valor:

System.getProperty("test");

El valor podría ser nullsin embargo, así que protéjase contra una excepción usando un Boolean:

boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );

Tenga en cuenta que el getBoolean El método delega el valor de la propiedad del sistema, simplificando el código a:

if( Boolean.getBoolean( "test" ) ) {
   // ...
}

  • último bit también es cierto para: Integer.getInteger("test"); Long.getLong("test") asumiendo que tienes -Dtest=123

    – mt.uulu

    19 de marzo de 2019 a las 18:59

avatar de usuario
maaartinus

Está dando parámetros a su programa en lugar de a Java. Usar

java -Dtest="true" -jar myApplication.jar 

en cambio.

Considere usar

"true".equalsIgnoreCase(System.getProperty("test"))

para evitar la NPE. Pero no uses “Condiciones de yoda“siempre sin pensar, a veces tirar la NPE es el comportamiento correcto y a veces algo como

System.getProperty("test") == null || System.getProperty("test").equalsIgnoreCase("true")

es correcto (siempre que sea cierto por defecto). Una posibilidad más corta es

!"false".equalsIgnoreCase(System.getProperty("test"))

pero no usar doble negación no hace que sea menos difícil de malinterpretar.

  • Realmente, System.getProperty("test", "true").equalsIgnoreCase("true") sería la mejor manera de escribir la última condición.

    – Paŭlo Ebermann

    18 de febrero de 2011 a las 22:05

  • Boolean.getBoolean("test"); es otra opción Ver.

    – superfavorito

    18 de febrero de 2011 a las 22:07

  • @Paulo Su solución funciona solo para propiedades (quería mostrar una general) pero es mejor que la mía.

    – maaartinus

    19 de febrero de 2011 a las 1:29

  • Interesante: en esta respuesta viene el parámetro JVM después la bandera -jar, mientras que en la otra respuesta viene después de “java” pero antes de la bandera -jar. Entonces, supongo que la clave es solo que el parámetro JVM viene antes del archivo JAR, en este caso, “myApplication.jar”.

    – Colm Bandal

    25 de junio de 2017 a las 9:55

  • Pulgares arriba por probar el punto sobre la doble negación de una manera tan obvia.

    – Silving

    11 de abril de 2018 a las 8:07

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad