2011-02-18 11 views
110

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

Por ejemplo, he tratado de escribir algo como esto ...

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

Y luego llamar así ...

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

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

+0

considere usar 'compareToIgnoreCase' en lugar de' equalsIgnoreCase' para identificadores de localización geográfica; de lo contrario, es posible que se encuentre con el problema de las cuatro causas turcas, entre otros. – McDowell

+4

¿Puedo sugerir usar Boolean.getBoolean en lugar de la instrucción if larga que tiene? http://www.shankh.com/2009/07/07/some-fun-with-boolean-getboolean/ – mark

Respuesta

175

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

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

Desde la línea de comando de ayuda:

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

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

(Usted debe probablemente también caer las cotizaciones, pero también puede funcionar de todos modos - que probablemente depende de su cáscara.)

+9

Funciona perfectamente ahora. También es interesante observar que para replicar este comportamiento dentro del depurador de Eclipse, estos tipos de parámetros deben colocarse en la sección Argumentos de máquina virtual en Configuraciones de ejecución. –

+0

Al menos desde * bash * funciona con las comillas allí (y también permite espacios de esta manera), lo uso todo el día para ant-calls. –

+0

¡Me siento un poco estúpido por la cantidad de tiempo que pasé en eso! Gracias por señalar eso. :) – toidiu

29

Eso debería ser:

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

entonces lo siguiente volver el valor:

System.getProperty("test"); 

el valor podría ser null, sin embargo, así protegerse contra una excepción utilizando un Boolean:

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

Tenga en cuenta que los delegados getBoolean método, el valor de la propiedad del sistema, simplificando el código para:

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

Usted le está dando parámetros a su programa en lugar de Java. Utilice

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

en su lugar.

considerar el uso de

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

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

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

está a la derecha (por defecto que proporciona cierto). Una posibilidad más corta es

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

pero no utilizar 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. –

+3

'Boolean.getBoolean (" prueba ");' es otra opción. [Ver] (http://download.oracle.com/javase/6/docs/api/java/lang/Boolean.html#getBoolean (java.lang.String)). – superfav

+0

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

Cuestiones relacionadas