Uso corretto dei parametri della riga di comando Java -D


147

Quando si passa un parametro -D in Java, qual è il modo corretto di scrivere la riga di comando e quindi accedervi dal codice?

Ad esempio, ho provato a scrivere qualcosa del genere ...

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

E poi chiamandolo così ...

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

Ma ricevo una NullPointerException. Che cosa sto facendo di sbagliato?


considerare l'utilizzo compareToIgnoreCaseinvece di equalsIgnoreCaseidentificatori agnostici locali; altrimenti potresti imbatterti nel problema turco del quattro-Is, tra gli altri.
McDowell,

4
Posso suggerire di usare Boolean.getBoolean invece della lunga if-statement che hai? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
mark

Cosa significa -D?
Anshul,

Risposte:


248

Ho il sospetto che il problema sia che hai inserito "-D" dopo il -jar. Prova questo:

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

Dalla guida della riga di comando:

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

In altre parole, il modo in cui lo hai in questo momento tratterà -Dtest="true"come uno degli argomenti da passare mainanziché come argomento JVM.

(Probabilmente dovresti anche eliminare le virgolette, ma potrebbe comunque funzionare bene - probabilmente dipende dalla tua shell.)


14
Funziona perfettamente ora. È anche interessante notare che per replicare questo comportamento all'interno del debugger Eclipse questi tipi di parametri devono essere inseriti nella sezione Argomenti VM in Esegui configurazioni.
Ryan Berger,

Almeno da bash funziona con le virgolette (e consente anche gli spazi in questo modo), lo uso tutto il giorno per le chiamate ant.
Paŭlo Ebermann,

Sentiti un po 'stupido per quanto tempo ho trascorso su quello! Grazie per la segnalazione. :)
toidiu,

4
nel caso qualcuno si chieda, se si desidera passare più proprietà basta usare -D più volte dopo uno 'spazio' java -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ...
p_champ,

48

Dovrebbe essere:

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

Quindi quanto segue restituirà il valore:

System.getProperty("test");

Il valore potrebbe essere null, tuttavia, quindi proteggiti da un'eccezione usando un Boolean:

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

Si noti che il getBooleanmetodo delega il valore della proprietà di sistema, semplificando il codice per:

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

1
l'ultimo bit vale anche per: Integer.getInteger("test"); Long.getLong("test")supponendo che tu abbia-Dtest=123
mt.uulu

23

Stai dando parametri al tuo programma invece a Java. Uso

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

anziché.

Prendi in considerazione l'utilizzo

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

per evitare l'NPE. Ma non usare " condizioni Yoda " sempre senza pensare, a volte lanciare l'NPE è il comportamento giusto e talvolta qualcosa di simile

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

è giusto (fornendo vero true). Una possibilità più breve è

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

ma non usare la doppia negazione non rende meno difficile fraintendere.


1
In realtà, System.getProperty("test", "true").equalsIgnoreCase("true")sarebbe il modo migliore per scrivere l'ultima condizione.
Paŭlo Ebermann,

3
Boolean.getBoolean("test");è un'altra opzione. Vedere .
Superfav,

@Paulo La tua soluzione funziona solo per proprietà (volevo mostrarne una generale) ma è più bella della mia.
maaartinus,

1
Interessante: in questa risposta il parametro JVM viene dopo il flag -jar, mentre nell'altra risposta viene dopo il "java" ma prima del flag -jar. Prendo quindi che la loro chiave è solo che il parametro JVM viene prima del file JAR stesso, in questo caso "myApplication.jar"?
Colm Bhandal,

1
Complimenti per dimostrare il punto sulla doppia negazione in un modo così ovvio.
Silwing
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.