2012-01-08 15 views
86

के बाहर गुण फ़ाइल पढ़ें मेरे पास एक JAR फ़ाइल है जहां मेरा सभी कोड चलने के लिए संग्रहीत किया गया है। मुझे एक प्रॉपर्टी फ़ाइल एक्सेस करना है जिसे प्रत्येक रन से पहले बदला/संपादित करना होगा। मैं गुण फ़ाइल को उसी निर्देशिका में रखना चाहता हूं जहां JAR फ़ाइल है। क्या जावा को उस निर्देशिका से गुण फ़ाइल लेने के लिए कहने के लिए वैसे भी है?JAR फ़ाइल

नोट: मैं गुण निर्देशिका को होम निर्देशिका में रखना नहीं चाहता हूं या कमांड लाइन तर्क में गुण फ़ाइल के पथ को पास नहीं करना चाहता हूं।

+0

देखें [यह उत्तर] (http://stackoverflow.com/a/5052359/418556) - * "इसके बजाय जार के अंदर 'डिफ़ॉल्ट' फ़ाइल को स्टोर करें। अगर यह बदला जाता है, तो स्टोर बदली गई फाइल किसी अन्य जगह पर। एक सामान्य स्थान 'user.home' की उप-निर्देशिका है। फ़ाइल की जांच करते समय, पहले फ़ाइल सिस्टम पर एक बदली गई फ़ाइल के अस्तित्व की जांच करें, और यदि यह अस्तित्व में नहीं है, तो डिफ़ॉल्ट फ़ाइल लोड करें। "* ** बीटीडब्ल्यू ** *" मैं नहीं चाहता .. "* आप क्या क्या काम करता है और व्यावहारिक है उससे कम महत्वपूर्ण है। एप्लिकेशन निर्देशिका में ऐप स्टोर करना ओरेकल और एमएस (और शायद अन्य) दोनों द्वारा दृढ़ता से निराश होता है। –

+2

कारण है कि मुझे जार निर्देशिका में गुण फ़ाइल रखने की आवश्यकता है जब उन्हें पूरी निर्देशिका (जार और संपत्ति समेत) की प्रतिलिपि बनाई जाती है तो उन्हें एक साथ रखना बेहतर होता है और चलाया जाता है। – SoulMan

+0

और यदि मैं उपयोगकर्ता को प्रॉपर्टी फ़ाइल पथ पास करने के लिए मजबूर करता हूं तो उसे बैच चलाने पर हर बार इसे बदलना होगा एक अलग मशीन से फ़ाइल। – SoulMan

उत्तर

112

तो, आप एक फ़ाइल के रूप में मुख्य/runnable जार के रूप में एक ही फ़ोल्डर के बजाय का एक संसाधन के रूप में अपने .properties फ़ाइल का इलाज करना चाहते हैं मुख्य/चलने योग्य जार।

पहले पहली बात:

: आपका प्रोग्राम फ़ाइल वास्तुकला इस तरह होगा (यह मानते हुए अपने मुख्य कार्यक्रम main.jar है और इसके मुख्य गुण फ़ाइल main.properties है) उस मामले में, अपने ही समाधान इस प्रकार है
./ - the root of your program 
|__ main.jar 
|__ main.properties 

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

app.version=1.0.0.0 
app.name=Hello 

इसलिए, जब आप इसके जड़/आधार फ़ोल्डर से अपने मुख्य कार्यक्रम चलाने के लिए, सामान्य रूप से आप इसे इस प्रकार चलेंगे:

java -jar ./main.jar 

या, सीधे:

java -jar main.jar 

अपने main.jar में, आप अपने main.properties फ़ाइल में पाए हर प्रॉपर्टी के लिए कुछ उपयोगिता तरीकों बनाने के लिए की जरूरत है;

/** 
* Gets the app.version property value from 
* the ./main.properties file of the base folder 
* 
* @return app.version string 
* @throws IOException 
*/ 
public static String getAppVersion() throws IOException{ 

    String versionString = null; 

    //to load application's properties, we use this class 
    Properties mainProperties = new Properties(); 

    FileInputStream file; 

    //the base folder is ./, the root of the main.properties file 
    String path = "./main.properties"; 

    //load the file handle for main.properties 
    file = new FileInputStream(path); 

    //load all the properties from this file 
    mainProperties.load(file); 

    //we have loaded the properties, so close the file handle 
    file.close(); 

    //retrieve the property we are intrested, the app.version 
    versionString = mainProperties.getProperty("app.version"); 

    return versionString; 
} 

मुख्य कार्यक्रम है कि app.version मूल्य की जरूरत के किसी भी भाग में, हम अपने विधि कॉल इस प्रकार है:: कहते हैं कि app.version संपत्ति getAppVersion() विधि इस प्रकार होगा जाने

String version = null; 
try{ 
    version = getAppVersion(); 
} 
catch (IOException ioe){ 
    ioe.printStackTrace(); 
} 
+7

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

+1

फ़ाइल नहीं मिलेगी यदि आप पूर्व से बाहर के आदेश को निष्पादित करते हैं: {{java -jar build/main.jar}}। क्या आपके पास इसके लिए कोई फिक्स है, @eee? – Darian

+0

@Darian यहां ठीक करने के लिए कुछ भी नहीं है; यह केवल डिज़ाइन के रूप में काम करता है जहां फ़ाइल संगठन आर्किटेक्चर में मैंने जो वर्णन किया है, उसके अनुसार जार और गुण फ़ाइल समान '। /' रूट फ़ोल्डर (समान निर्देशिका स्तर) पर होनी चाहिए। (मूल पोस्टर द्वारा निर्धारित आवश्यकता के अनुसार) – ecle

0

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

इसके अलावा इस प्रश्न पर मेरा उत्तर की जाँच करें:

making .exe file for java project containing sqlite

27

मैं इसे द्वारा किया अन्य रास्ता।

Properties prop = new Properties(); 
    try { 

     File jarPath=new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 
     String propertiesPath=jarPath.getParentFile().getAbsolutePath(); 
     System.out.println(" propertiesPath-"+propertiesPath); 
     prop.load(new FileInputStream(propertiesPath+"/importer.properties")); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
  1. प्राप्त जार फ़ाइल पथ।
  2. उस फ़ाइल का अभिभावक फ़ोल्डर प्राप्त करें।
  3. अपने गुण फ़ाइल नाम के साथ इनपुटस्ट्रीमपैथ में उस पथ का उपयोग करें।
+0

मुझे getParentFile() भाग को छोड़ना पड़ा, इसलिए मैंने इसका उपयोग किया: स्ट्रिंग गुणपाथ = jarPath.getAbsolutePath(); लेकिन यह सब इस बात पर निर्भर करता है कि फ़ाइल कहां स्थित है – MobileMon

+2

बस "jarPath.getParentFile() को बदलें। getAbsolutePath();" "jarPath.getParent()" के लिए। तब एक आकर्षण की तरह काम करता है। – StackAddict

+0

मेरे मामले में समस्या ही है लेकिन मेरे पास स्प्रिंग बेस प्रोजेक्ट है। बसंत कैसे कहें कि फ़ाइल जार फ़ाइल के बगल में है? कोई उपाय – Mubasher

0

मैं एक ऐसी ही मामला है: मेरे *.jar फ़ाइल चाहने के बगल में कहा *.jar फ़ाइल एक निर्देशिका में एक फ़ाइल का उपयोग करने के लिए।THIS ANSWER का भी संदर्भ लें।

मेरे फ़ाइल संरचना है:

./ - the root of your program 
|__ *.jar 
|__ dir-next-to-jar/some.txt 

मैं निम्नलिखित के साथ *.jar फाइल के अंदर एक InputStream के लिए एक फ़ाइल (जैसे कि, some.txt) लोड करने में सक्षम हूँ:

InputStream stream = null; 
    try{ 
     stream = ThisClassName.class.getClass().getResourceAsStream("/dir-next-to-jar/some.txt"); 
    } 
    catch(Exception e) { 
     System.out.print("error file to stream: "); 
     System.out.println(e.getMessage()); 
    } 

तो कर जो कुछ भी आप stream

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