2012-06-22 32 views
21

के भीतर निष्पादन योग्य जार का नाम प्राप्त करें मैंने क्लाइंट लॉन्च करते समय उपयोगकर्ता को कमांड लाइन पैरामीटर निर्दिष्ट करने की क्षमता देने के लिए एक निष्पादन योग्य जार बनाया है और कॉमन्स-क्ली का उपयोग किया है। सब कुछ ठीक काम करता है। हालांकि, जब मैं जार के लिए उपयोग विवरण प्रिंट भी, मैं निम्नलिखित दिखाना चाहते हैं:मुख्य() विधि

usage: java -jar myprog.jar <options> <file> 
--help Display the help message 
--debug Enable debugging 
.... 

सभी विकल्पों में से मुद्रण आसानी कॉमन्स-CLI साथ किया जाता है। हालांकि, "उपयोग" रेखा सिर स्क्रैचर है। मैं तर्कों से [myprog.jar "नाम प्राप्त करने का तरीका नहीं समझ सकता [] जो एप्लिकेशन को पास कर दिया गया है।

क्या ऐसा करने का कोई आसान तरीका है? मैं अपने वर्ग के क्लासलोडर से पीछे ट्रेस करने के लिए एक सुंदर गठित विधि का उपयोग कर सकता हूं और यह पता लगा सकता हूं कि यह एक जार में निहित है, लेकिन ऐसा लगता है कि यह एक बहुत ही सरल सवाल होना चाहिए।

private String getPath(Class cls) { 
    String cn = cls.getName(); 
    String rn = cn.replace('.', '/') + ".class"; 
    String path = 
      getClass().getClassLoader().getResource(rn).getPath(); 
    int ix = path.indexOf("!"); 
    if(ix >= 0) { 
     return path.substring(0, ix); 
    } else { 
     return path; 
    } 
} 
+0

ने कोशिश की http://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file?lq=1? – Charles

+0

मैंने पहले से ही उस लिंक को देखा था, लेकिन ऐसा लगता है कि यह लगभग "हैक" भी था। मैं विश्वास नहीं कर सकता कि एक और सीधा समाधान नहीं है। इसके अतिरिक्त, एपीआई का कहना है कि "getCodeSource()" शून्य वापस आ सकता है, लेकिन कौन सी स्थितियों के तहत विस्तृत नहीं करता है, इसलिए मैंने स्वाभाविक रूप से सोचा कि क्या यह उपयोग करने के लिए "असफल-सुरक्षित" विधि थी। –

उत्तर

33

ये रहा:

new java.io.File(SomeClassInYourJar.class.getProtectionDomain() 
    .getCodeSource() 
    .getLocation() 
    .getPath()) 
.getName() 

संपादित करें: मैं getSourceCode API के बारे में अपनी टिप्पणी को देखा। खैर, शायद यह जावा में आप कर सकते हैं सबसे अच्छा है। getCodeSource()null लौटने पर, मुझे लगता है कि यह मुख्य रूप से java.lang.* और अन्य विशेष कक्षाओं में कक्षाओं पर होता है जिसके लिए स्रोत स्थान "छुपा" होता है। हालांकि अपने खुद के वर्गों के लिए काम करना चाहिए।

+0

धन्यवाद - यह वही बात है जो @ चार्ल्स ने एसओ लिंक में इंगित किया। जैसा कि मैंने उपरोक्त उल्लेख किया है, मेरी सबसे बड़ी चिंता यह है कि 'getCodeSource()' के लिए एपीआई इंगित करता है कि यह शून्य हो सकता है, लेकिन कौन सी स्थितियों के तहत विस्तृत नहीं करता है। –

+0

इसके साथ दूसरी समस्या यह है कि यह इस तथ्य को ध्यान में रखता है कि वर्ग फ़ाइल को अभिलेखागार में घोंसला नहीं दिया जा सकता है। तो मुझे अभी भी '!' सबस्ट्रिंग की जांच करनी होगी। जैसे मैंने कहा, यह थोड़ा गुंजाइश लगता है और मुझे आश्चर्य है कि जावा का बेहतर समाधान नहीं है। –

+0

यह ज्यादातर इसलिए है क्योंकि आपके द्वारा चलाए जा रहे जार फ़ाइल के नाम को जानने का शायद ही कोई कारण है। कार्यक्षमता (आदर्श) नाम से स्वतंत्र होना चाहिए। – Charles

0

आपको GetPath() को कॉल करने से पहले किसी भी मामले में .toURI() जोड़ना चाहिए। जावा के यूआरएल कार्यान्वयन में कुछ quirks के कारण Thats - विवरण के लिए how to encode URL to avoid special characters in java देखें।

संबंधित मुद्दे