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


147

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 en compareToIgnoreCaselugar de equalsIgnoreCaseidentificadores agnósticos locales; de lo contrario, puede encontrarse con el problema turco de cuatro is, entre otros.
McDowell

44
¿Puedo sugerirle usar Boolean.getBoolean en lugar de la larga declaración if que tiene? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
marque el

¿Qué significa -D?
Anshul

Respuestas:


248

Sospecho que el problema es que usted ha puesto la "D" después de la -jar. Prueba esto:

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

Desde la línea de comando ayuda:

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

En otras palabras, la forma en que lo tiene en este momento se tratará -Dtest="true"como uno de los argumentos para pasar en mainlugar de como un argumento JVM.

(Probablemente también debería descartar las comillas, pero puede funcionar de todos modos, probablemente depende de su shell).


14
Funciona perfectamente ahora. También es interesante notar 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

Al menos desde bash funciona con las comillas allí (y también permite espacios de esta manera), lo uso todo el día para llamadas ant.
Paŭlo Ebermann

¡Siéntete un poco estúpido por el tiempo que pasé en eso! Gracias por señalar eso. :)
toidiu

44
en caso de que alguien se pregunte, si desea pasar varias propiedades simplemente use -D varias veces después de un 'espacio' java -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ...
p_champ

48

Eso debería ser:

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

Entonces lo siguiente devolverá el valor:

System.getProperty("test");

Sin nullembargo, el valor podría ser , así que evite una excepción utilizando un Boolean:

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

Tenga en cuenta que el getBooleanmétodo delega el valor de propiedad del sistema, simplificando el código para:

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

1
el último bit también es cierto para: Integer.getInteger("test"); Long.getLong("test")suponiendo que usted tiene-Dtest=123
mt.uulu

23

Estás dando parámetros a tu programa en lugar de a Java. Utilizar

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

en lugar.

Considere usar

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

para evitar la NPE. Pero no use las " condiciones de Yoda " siempre sin pensar, a veces lanzar el NPE es el comportamiento correcto y otras veces algo así como

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

es correcto (proporciona el valor predeterminado verdadero). Una posibilidad más corta es

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

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


1
En realidad, System.getProperty("test", "true").equalsIgnoreCase("true")sería la mejor manera de escribir la última condición.
Paŭlo Ebermann

3
Boolean.getBoolean("test");Es otra opción. Ver .
superfav

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

1
Interesante: en esta respuesta, el parámetro JVM viene después del indicador -jar, mientras que en la otra respuesta viene después del "java" pero antes del indicador -jar. Supongo que la clave es solo que el parámetro JVM viene antes que el archivo JAR, en este caso "myApplication.jar".
Colm Bhandal

1
Felicitaciones por probar el punto sobre la doble negación de una manera tan obvia.
Silwing
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.