जावा-डी कमांड लाइन मापदंडों का उचित उपयोग


147

जावा में -D पैरामीटर पास करते समय, कमांड-लाइन लिखने और फिर उसे कोड से एक्सेस करने का उचित तरीका क्या है?

उदाहरण के लिए, मैंने कुछ इस तरह से लिखने की कोशिश की है ...

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

और फिर इसे इस तरह से कॉल करना ...

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

लेकिन मुझे NullPointerException मिलती है। मैं क्या गलत कर रहा हूं?


स्थानीय-अज्ञेय पहचानकर्ताओं के compareToIgnoreCaseबजाय उपयोग करने पर विचार करें equalsIgnoreCase; अन्यथा आप दूसरों के बीच तुर्की चार-समस्या में भाग सकते हैं।
मैकडॉवेल

4
क्या मैं लंबे समय के बयान के बजाय बूलियन.गेट बुलियन का उपयोग करने का सुझाव देता हूं जो आपके पास है? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
mark

-D का क्या मतलब है?
अंशुल

जवाबों:


248

मुझे लगता है समस्या यह है कि आप रख दिया है "डी" है के बाद-jar । इसे इस्तेमाल करे:

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

कमांड लाइन की मदद से:

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

दूसरे शब्दों में, इस समय आपको जो तरीका मिला है वह जेवीएम तर्क के बजाय -Dtest="true"पारित करने के लिए mainएक तर्क के रूप में माना जाएगा।

(आप शायद उद्धरण भी छोड़ दें, लेकिन यह वैसे भी अच्छी तरह से काम कर सकता है - यह संभवतः आपके शेल पर निर्भर करता है।)


14
अब पूरी तरह से काम करता है। यह भी ध्यान रखना दिलचस्प है कि ग्रहण डिबगर के भीतर इस व्यवहार को दोहराने के लिए, इन प्रकार के मापदंडों को रन कॉन्फ़िगरेशन के तहत वीएम तर्क खंड में रखा जाना चाहिए।
रयान बर्जर

कम से कम बाश से यह वहां के उद्धरणों के साथ काम करता है (और इस तरह से रिक्त स्थान की अनुमति भी देता है), मैं पूरे दिन एंटी-कॉल के लिए इसका उपयोग करता हूं।
पाओलो एबरमन

मैं उस पर कितना समय बिताया पर थोड़े बेवकूफ लग रहा है! यह बात बताने के लिए धन्यवाद। :)
22

4
यदि कोई व्यक्ति सोच रहा है, यदि आप कई गुणों का उपयोग करना चाहते हैं, तो 'स्पेस' जावा -D <key1> = <value1 -D <key2> = <value2> -D <key3> = <value3 के बाद कई बार -D का उपयोग करें > ...
p_champ

48

होना चाहिए:

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

फिर निम्नलिखित मूल्य वापस करेगा:

System.getProperty("test");

मूल्य null, हालांकि, एक का उपयोग कर एक अपवाद के खिलाफ गार्ड हो सकता है Boolean:

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

ध्यान दें कि getBooleanविधि सिस्टम प्रॉपर्टी वैल्यू को दर्शाती है, कोड को सरल बनाने के लिए:

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

1
अंतिम बिट भी इसके लिए सही है: Integer.getInteger("test"); Long.getLong("test")यह मानते हुए कि आपके पास है-Dtest=123
mt.uulu

23

आप जावा के बजाय अपने प्रोग्राम को पैरामीटर दे रहे हैं। उपयोग

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

बजाय।

का उपयोग करने पर विचार करें

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

एनपीई से बचने के लिए। लेकिन हमेशा बिना सोचे समझे " योडा परिस्थितियों " का उपयोग न करें , कभी-कभी एनपीई को फेंकना सही व्यवहार है और कभी-कभी कुछ ऐसा होता है

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

सही है (डिफ़ॉल्ट सत्य प्रदान करते हुए)। एक छोटी संभावना है

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

लेकिन दोहरे नकार का उपयोग नहीं करने से गलतफहमी कम नहीं होती है।


1
दरअसल, System.getProperty("test", "true").equalsIgnoreCase("true")आखिरी शर्त लिखने का यह बेहतर तरीका होगा।
पाओलो एबरमन

3
Boolean.getBoolean("test");एक और विकल्प है। देख लो
22

@Paulo आपका समाधान केवल संपत्तियों के लिए काम करता है (मैं एक सामान्य दिखाना चाहता था) लेकिन मेरी तुलना में अच्छा है।
Maaartinus

1
दिलचस्प है: इस उत्तर में JVM पैरामीटर -jar ध्वज के बाद आता है , जबकि अन्य उत्तर में यह "java" के बाद आता है, लेकिन -jar ध्वज से पहले । मैं तब यह लेता हूं कि वे कुंजी केवल यह है कि JVM पैरामीटर JAR फाइल से पहले आता है, इस मामले में "myApplication.jar"?
कोलम भंडाल

1
इस तरह के एक स्पष्ट तरीके से दोहरे नकार के बारे में बात साबित करने के लिए अंगूठे।
सिलविंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.