When passing a -D parameter in Java, what is the proper way of writing the command-line and then accessing it from code?
For example, I have tried writing something like this...
if (System.getProperty("test").equalsIgnoreCase("true")) { //Do something } And then calling it like this...
java -jar myApplication.jar -Dtest="true" But I receive a NullPointerException. What am I doing wrong?
33 Answers
I suspect the problem is that you've put the "-D" after the -jar. Try this:
java -Dtest="true" -jar myApplication.jar From the command line help:
java [-options] -jar jarfile [args...] In other words, the way you've got it at the moment will treat -Dtest="true" as one of the arguments to pass to main instead of as a JVM argument.
(You should probably also drop the quotes, but it may well work anyway - it probably depends on your shell.)
4That should be:
java -Dtest="true" -jar myApplication.jar Then the following will return the value:
System.getProperty("test"); The value could be null, though, so guard against an exception using a Boolean:
boolean b = Boolean.parseBoolean( System.getProperty( "test" ) ); Note that the getBoolean method delegates the system property value, simplifying the code to:
if( Boolean.getBoolean( "test" ) ) { // ... } 1You're giving parameters to your program instead to Java. Use
java -Dtest="true" -jar myApplication.jar instead.
Consider using
"true".equalsIgnoreCase(System.getProperty("test")) to avoid the NPE. But do not use "Yoda conditions" always without thinking, sometimes throwing the NPE is the right behavior and sometimes something like
System.getProperty("test") == null || System.getProperty("test").equalsIgnoreCase("true") is right (providing default true). A shorter possibility is
!"false".equalsIgnoreCase(System.getProperty("test")) but not using double negation doesn't make it less hard to misunderstand.
9