জাভা-ডি কমান্ড-লাইন পরামিতিগুলির যথাযথ ব্যবহার


147

জাভাতে কোনও -D প্যারামিটারটি পাস করার সময়, কমান্ড-লাইনটি লেখার এবং তারপরে কোড থেকে অ্যাক্সেস করার সঠিক উপায় কী?

উদাহরণস্বরূপ, আমি এই জাতীয় কিছু লেখার চেষ্টা করেছি ...

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

এবং তারপরে এটিকে কল করা ...

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

তবে আমি একটি নালপয়েন্টার এক্সসেপশন পেয়েছি। আমি কি ভুল করছি?


লোকেল-অজোনস্টিক সনাক্তকারীগুলির compareToIgnoreCaseপরিবর্তে ব্যবহারের কথা বিবেচনা করুন equalsIgnoreCase; অন্যথায় আপনি অন্যদের মধ্যে তুর্কি ফোর-ইজ সমস্যাটিতে প্রবেশ করতে পারেন।
ম্যাকডোয়েল

4
আপনার কাছে লম্বা ই-স্টেটমেন্টের পরিবর্তে আমি বুলিয়ান.সেটবুলিয়ান ব্যবহারের পরামর্শ দিতে পারি? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
চিহ্নিত করুন

-ডি মানে কি?
আনশুল

উত্তর:


248

আমি সন্দেহ সমস্যা হল আপনি রেখেছি "-D" হয় পরে-jar । এটা চেষ্টা কর:

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

কমান্ড লাইন সহায়তা থেকে:

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

অন্য কথায়, আপনি এই মুহুর্তে এটি যেভাবে পেয়েছেন তা জেভিএম যুক্তির পরিবর্তে আর্গুমেন্টগুলির মধ্যে একটি হিসাবে -Dtest="true"প্রেরণ করবে main

(আপনার সম্ভবত কোটগুলিও বাদ দেওয়া উচিত , তবে এটি যে কোনও উপায়ে কার্যকর হতে পারে - এটি সম্ভবত আপনার শেলের উপর নির্ভর করে))


14
এখন পুরোপুরি কাজ করে। এছাড়াও লক্ষণীয় আকর্ষণীয় হ'ল একিলিপ ডিবাগারের মধ্যে এই আচরণটি প্রতিলিপি করতে এই ধরণের পরামিতিগুলি রান কনফিগারেশনের অধীনে ভিএম যুক্তি বিভাগে স্থাপন করা আবশ্যক।
রায়ান বার্গার

কমপক্ষে ব্যাশ থেকে এটি সেখানে উদ্ধৃতিগুলির সাথে কাজ করে (এবং এইভাবে ফাঁকা স্থানগুলিকেও অনুমতি দেয়), আমি এটিকে সারা দিন পিপড়া-কলগুলির জন্য ব্যবহার করি।
পাওলো ইবারম্যান

আমি কতটা সময় কাটিয়েছি তাতে মূর্খ বোধ করছি! যে ইশারা জন্য ধন্যবাদ। :)
toidiu

4
যদি কেউ ভাবছেন যে আপনি যদি একাধিক বৈশিষ্ট্য পাস করতে চান তবে 'স্পেস' জাভা-র পরে একাধিক সময় ব্যবহার করুন -ডি <key1> = <value1> -D <key2> = <মূল্য> 2D -D <key3> = <মান 3 > ...
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
এটির

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")শেষ শর্তটি লেখার জন্য আরও ভাল উপায় way
পাওলো ইবারম্যান

3
Boolean.getBoolean("test");অন্য বিকল্প। দেখুন
সুপারফ্যাভ

@ পাওলো আপনার সমাধানটি কেবলমাত্র বৈশিষ্ট্যের জন্য কাজ করে (আমি একটি সাধারণ দেখাতে চেয়েছিলাম) তবে এটি আমার চেয়ে ভাল।
মার্টিনাস

1
আকর্ষণীয়: এই উত্তরে জেভিএম প্যারামিটারটি -জাজার পতাকা পরে আসে , অন্য উত্তরটিতে এটি "জাভা" পরে আসে তবে -জার পতাকার আগে । আমি তখন তা গ্রহণ করি যে তারা কী কেবল জেভিএম প্যারামিটারটি নিজেই জেআর ফাইলের আগে আসবে, এই ক্ষেত্রে "মাই অ্যাপ্লিকেশন.জার"?
কলম্ব ভান্ডাল

1
এই ধরনের একটি সুস্পষ্ট উপায়ে দ্বিগুণ প্রত্যাখ্যান সম্পর্কে পয়েন্ট প্রমাণ করার জন্য থাম্বস আপ।
সিলিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.