2011-06-22 20 views
8

चलाते समय वर्तमान कार्यशील निर्देशिका मैंने एक ऐसे उपयोगकर्ता को बनाया है जो एक उपयोगकर्ता के कॉन्फ़िगर करने योग्य संसाधनों के साथ एक चलने योग्य जार (मेवेन-असेंबली प्लगइन का उपयोग करके) है जो उसी निर्देशिका में (छवियों, गुणों, इत्यादि)जार

java -jar ... के साथ कमांड लाइन से जार चलाते समय वर्तमान निर्देशिका की अपेक्षा की जाती है। समस्या यह है कि कुछ ऑपरेटिंग सिस्टम (उबंटू 11.04) पर, यदि आवेदन जार पर डबल क्लिक करके शुरू किया जाता है तो वर्तमान कार्यशील निर्देशिका होम निर्देशिका है।

क्या जार में मौजूद मौजूदा निर्देशिका को प्राप्त करने का एक पसंदीदा तरीका है, या जार के साथ बैठे बाहरी संसाधनों तक पहुंचने के लिए एक और विधि पूरी तरह से है?

उत्तर

11

आप जर्फ़ाइल का स्थान प्राप्त करने के लिए MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath() का उपयोग कर सकते हैं।

एक और विकल्प संबंधित कक्षाओं के साथ आपके जर्फ़ाइल में अन्य पढ़ने-योग्य संसाधनों को पैकेज करना होगा ताकि आप दिए गए वर्ग के सापेक्ष संसाधन प्राप्त करने के लिए Class.getResource(String) या Class.getResourceAsStream(String) का उपयोग कर सकें।

उदाहरण के लिए, यदि आप एक वर्ग com.example.icons.Icons हो सकता है, और माउस com/उदाहरण/MyApp/माउस/ रास्ते में Icons.class के साथ पैक किया जाएगा। जहां एक जार चल रहा है से निर्देशिका की खोज करने के लिए अपने प्रयास

ImageIcon icon = new ImageIcon(Icons.getResource("open.png")); 
+0

कोड का पहला हिस्सा जार के लिए काम करता है लेकिन जब मैं ग्रहण के भीतर से चलाता हूं तो टूट जाता है (जब तक कि मैं फ़ाइलों को स्थानांतरित नहीं करता)। दुर्भाग्यवश, जार के अंदर संसाधनों को पैकेज करना एक विकल्प नहीं है क्योंकि उपयोगकर्ता को उन्हें कॉन्फ़िगर करने की आवश्यकता हो सकती है। – job

1

यहाँ: मान लीजिए आपके "खुला" बटन एक आइकन नामित open.png उपयोग करता है।

public class JarLocation { 
    public static void main(String[] args) { 
     new JarLocation().say(); 
    } 

    public void say() { 
     String className = this.getClass().getName().replace('.', '/'); 
     String classJar = 
      this.getClass().getResource("/" + className + ".class").toString(); 
     if (classJar.startsWith("jar:")) { 
      System.out.println("*** running from jar!"); 
     } 
     javax.swing.JOptionPane.showConfirmDialog((java.awt.Component) 
       null, classJar, "jar location", 
       javax.swing.JOptionPane.DEFAULT_OPTION); 
    } 
} 

सबसे पहले मैं वर्तमान वर्ग का "पथ" बनाकर "।" "/" द्वारा, फिर मैं संसाधन के रूप में .class को पुनर्प्राप्त करता हूं। निर्देशिका पुनः प्राप्त करने के जहां जार है

jar:file:/C:/temp/testing.jar!/my/package/JarLocation.class 

आपकी पार्स से दिए गए स्ट्रिंग: toString() विधि की तरह कुछ देता है।