सर्वलेट आधारित एप्लिकेशन में कॉन्फ़िगरेशन संसाधन फ़ाइलों को कहाँ रखें और कैसे पढ़ें?


222

मेरे वेब एप्लिकेशन में मुझे पूर्वनिर्धारित उपयोगकर्ताओं के सेट को ईमेल भेजना है finance@xyz.com, इसलिए मैं चाहता हूं कि इसे एक .propertiesफ़ाइल में जोड़ दूं और जब आवश्यक हो, इसे एक्सेस कर सकता हूं । क्या यह एक सही प्रक्रिया है, यदि हां, तो मुझे यह फ़ाइल कहां रखनी चाहिए? मैं नेटबीन्स आईडीई का उपयोग कर रहा हूं जिसमें स्रोत और जेएसपी फ़ाइलों के लिए दो अलग-अलग फ़ोल्डर हैं।


JNDI शायद एक समाधान हो सकता है?
तुलसी बॉर्क

जवाबों:


464

यह तुम्हारी पसंद है। जावा वेब एप्लिकेशन संग्रह (WAR) में मूल रूप से तीन तरीके हैं:


1. इसे क्लासपाथ में रखो

ताकि आप इसे ClassLoader#getResourceAsStream()क्लासपाथ-रिलेटिव पाथ से लोड कर सकें :

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);

यहाँ foo.propertiesजड़ों जो एक webapp, जैसे वेब ऐप्लिकेशन की डिफ़ॉल्ट classpath के अंतर्गत आते हैं में से एक में रखा जाना माना जाता है /WEB-INF/libऔर /WEB-INF/classes, सर्वर /lib, या JDK / JRE की /lib। यदि propertiesfile वेब-विशिष्ट है, तो इसे इसमें रखना सबसे अच्छा है /WEB-INF/classes। यदि आप एक IDE में एक मानक WAR परियोजना विकसित कर रहे हैं, तो इसे srcफ़ोल्डर (परियोजना के स्रोत फ़ोल्डर) में छोड़ दें। यदि आप मावेन परियोजना का उपयोग कर रहे हैं, तो इसे /main/resourcesफ़ोल्डर में छोड़ दें ।

आप वैकल्पिक रूप से इसे डिफ़ॉल्ट क्लासपाथ के बाहर भी रख सकते हैं और अपने पथ को एब्जर्वर के क्लासपाथ में जोड़ सकते हैं। उदाहरण के लिए टॉमकैट आप इसे shared.loaderसंपत्ति के रूप में कॉन्फ़िगर कर सकते हैं Tomcat/conf/catalina.properties

यदि आपने foo.propertiesइसे जावा पैकेज संरचना में रखा है com.example, तो आपको इसे नीचे लोड करने की आवश्यकता है

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...

ध्यान दें कि संदर्भ श्रेणी लोडर का यह पथ ए से शुरू नहीं होना चाहिए /। केवल जब आप "रिश्तेदार" वर्ग लोडर का उपयोग कर रहे हैं SomeClass.class.getClassLoader(), तो आपको वास्तव में इसे एक के साथ शुरू करने की आवश्यकता है /

ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...

हालाँकि, गुण फ़ाइल की दृश्यता निर्भर करता है तब प्रश्न में वर्ग लोडर पर। यह केवल उसी श्रेणी लोडर को दिखाई देता है, जो कक्षा को लोड करता है। इसलिए, यदि क्लास को webapp क्लास लोडर के बजाय उदाहरण के लिए सर्वर कॉमन क्लास लोडर द्वारा लोड किया गया है, और गुण फ़ाइल वेबैप के अंदर ही है, तो यह अदृश्य है। संदर्भ वर्ग लोडर आपकी सबसे सुरक्षित शर्त है ताकि आप गुण फ़ाइल को "सर्वत्र" कक्षा में जगह दे सकें और / या आप वेब पर मौजूद किसी सर्वर-प्रदायक को ओवरराइड करने में सक्षम हों।


2. इसे वेब कॉन्टेंट में डालें

ताकि आप इसे ServletContext#getResourceAsStream()वेब-कॉन्टेंट-रिलेटिव पाथ से लोड कर सकें :

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...

ध्यान दें कि मैंने फ़ाइल को /WEB-INFफ़ोल्डर में रखने के लिए प्रदर्शित किया है , अन्यथा यह किसी भी वेबब्रोसर द्वारा सार्वजनिक रूप से सुलभ होता। यह भी ध्यान दें कि ServletContextकिसी भी HttpServletवर्ग में विरासत में GenericServlet#getServletContext()और अंदर Filterतक ही पहुँचा जा सकता है FilterConfig#getServletContext()। यदि आप सर्वलेट क्लास में नहीं हैं, तो यह आमतौर पर केवल इंजेक्शन के माध्यम से होता है @Inject


3. इसे लोकल डिस्क फाइल सिस्टम में डालें

ताकि आप इसे एक सामान्य java.ioस्थानीय डिस्क फ़ाइल सिस्टम पथ के साथ सामान्य तरीके से लोड कर सकें :

InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...

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


कौन सा चुनना है?

बस में लाभ / नुकसान का वजन अपने रख-रखाव की खुद की राय।

यदि गुण फाइलें "स्थिर" हैं और रनटाइम के दौरान कभी भी बदलने की आवश्यकता नहीं है, तो आप उन्हें WAR में रख सकते हैं।

यदि आप हर बार WAR के पुनर्निर्माण और पुनर्वितरण की आवश्यकता के बिना वेब एप्लिकेशन के बाहर से संपत्तियों की फ़ाइलों को संपादित करने में सक्षम होना पसंद करते हैं, तो इसे प्रोजेक्ट के बाहर क्लासपाथ में डालें (यदि आवश्यक हो तो डायरेक्टरी को क्लासपाथ में जोड़ें)।

यदि आप Properties#store()विधि का उपयोग करके वेब अनुप्रयोग के अंदर से प्रोग्राम फ़ाइलों को संपत्तियों को संपादित करने में सक्षम होना पसंद करते हैं , तो इसे वेब एप्लिकेशन के बाहर रखें। जैसा कि Properties#store()एक की आवश्यकता है Writer, आप एक डिस्क फ़ाइल सिस्टम पथ का उपयोग करके चारों ओर नहीं जा सकते। वह रास्ता बदले में VM तर्क या सिस्टम प्रॉपर्टी के रूप में वेब एप्लिकेशन को दिया जा सकता है। एहतियात के तौर पर, कभी उपयोग करेंgetRealPath() । परिनियोजन फ़ोल्डर में सभी परिवर्तन साधारण कारण के लिए एक पुन: लोड पर खो जाएंगे कि मूल WAR फ़ाइल में परिवर्तन वापस दिखाई नहीं देते हैं।

यह सभी देखें:


2
"मैं व्यक्तिगत रूप से इसे प्रोजेक्ट के बाहर क्लासपाथ में रखना पसंद करता हूं (क्लासपाथ में नया रास्ता जोड़ें)" उलझन में, क्या आप एक उदाहरण दे सकते हैं?
ब्लेंकमैन

4
@Blankman वह शायद एक नया फ़ोल्डर बनाने का मतलब है, अपने सभी कस्टम कॉन्फ़िगरेशन फ़ाइलों को वहां रख रहा है, और उस फ़ोल्डर को क्लासपाथ में जोड़ रहा है। तो: 1) कहीं 'appconfs' नामक एक फ़ोल्डर बनाएँ ( /etc/appconfs2 भी हो सकता है ) उस फ़ोल्डर को ऐप सर्वर या डोमेन के classpath में जोड़ें। दूसरा चरण ऐप सर्वर विशिष्ट है, मुझे नहीं लगता कि इसके लिए सामान्य उदाहरण है।
तुक्का मुस्टोंन

पुन :: 2: क्यों "WEB-INF/filename.properties"और दोनों "/WEB-INF/filename.properties"( /शुरुआत में नोटिस ) काम करेंगे? क्या किसी एक को दूसरे पर पसंद करने का कोई कारण है?
Mr_and_Mrs_D 14

मुझे इस मुद्दे पर पिछले एक दिन के लिए तय किया गया है। मैं अपनी गुण फ़ाइल लोड करने में सक्षम नहीं हूं। मैं इसे दो स्थानों से लोड करने में सक्षम हूं। एक सिस्टम डायरेक्टरी है और एक लोकल ड्राइव है। यह लोकलहोस्ट के साथ काम करता है। लेकिन मैं इसे अमेज़न पर तैनात करना चाहता हूं।
अरुण राजा

मैं netbeans IDE का उपयोग कर रहा हूं और वेब पेज / संसाधनों में गुण फ़ाइल रखता हूं। मैं इसे "./eb पेज / संसाधन / config.properties" के रूप में एक्सेस करने का प्रयास करता हूं। मैं इसे एक्सेस नहीं कर पा रहा हूं। क्रिप्या मेरि सहायता करे।
अरुण राजा

9

चेतावनी का शब्द: यदि आप अपने WEB-INF/classesफ़ोल्डर में कॉन्फिग फाइल रखते हैं , और आपकी आईडीई, एक्लिप्स कहती है, एक साफ / पुनर्निर्माण करता है, तो यह आपकी गोपनीय फाइलों को तब तक न्यूड करेगा जब तक वे जावा सोर्स डायरेक्टरी में नहीं थीं। BalusC का शानदार उत्तर विकल्प 1 में है लेकिन मैं जोर जोड़ना चाहता था।

मैंने कठिन तरीका सीखा कि यदि आप ग्रहण में एक वेब प्रोजेक्ट को "कॉपी" करते हैं, तो यह किसी भी स्रोत फ़ोल्डर से एक साफ / पुनर्निर्माण करता है। मेरे मामले में मैंने अपने POJO जावा लाइब्रेरी से एक "लिंक्ड सोर्स डायर" जोड़ा था, यह WEB-INF/classesफ़ोल्डर में संकलित होगा । उस परियोजना में एक साफ / पुनर्निर्माण करना (वेब ​​ऐप परियोजना नहीं) एक ही समस्या का कारण बना।

मैंने POJO src फ़ोल्डर में अपना कॉन्फिडेंस डालने के बारे में सोचा, लेकिन ये कॉन्फिडेंस 3rd पार्टी लिबास (जैसे क्वार्ट्ज या URLRrrite) के लिए हैं जो WEB-INF/libफोल्डर में हैं, इसलिए इसका कोई मतलब नहीं था। मैं इसे वेब प्रोजेक्ट्स "src" फ़ोल्डर में डालने का परीक्षण करने की योजना बनाता हूं, जब मैं इसके चारों ओर पहुंचता हूं, लेकिन वह फ़ोल्डर वर्तमान में खाली है और इसमें गोपनीय फाइलें होने से यह अप्रभावी लगता है।

में conf फ़ाइलें रखने के लिए मैं वोट तो WEB-INF/commonConfFolder/filename.properties, अगले वर्गों फ़ोल्डर, जो Balus विकल्प 2 है।


1
यदि आप WEB_INF के उप फ़ोल्डर में अपनी कॉन्फिग फाइल डालते हैं तो आप उस तक कैसे पहुँचते हैं? मुझे 'configFiles / prop.properties' कहने का सौभाग्य नहीं मिला है
JesseBoyd

ठीक है यह 'जावा रिसोर्स / src /' के तहत प्रॉपर्टी फाइल डालने का काम करता है, यह मेरे किसी एक पैकेज के अंदर से काम नहीं करता है और src के मूल में होना चाहिए। वर्गों के फ़ोल्डर के बारे में आपकी चेतावनी को ध्यान में रखा जाना एक वैध चिंता है।
जेसीबॉयड

6

Ex: web.xml में टैग दर्ज करें

<context-param>
        <param-name>chatpropertyfile</param-name>
        <!--  Name of the chat properties file. It contains the name and description                   of rooms.-->     
        <param-value>chat.properties</param-value>
    </context-param>

और chat.properties आप इस तरह से अपने गुणों की घोषणा कर सकते हैं

पूर्व के लिए:

Jsp = Discussion about JSP can be made here.
Java = Talk about java and related technologies like J2EE.
ASP = Discuss about Active Server Pages related technologies like VBScript and JScript etc.
Web_Designing = Any discussion related to HTML, JavaScript, DHTML etc.
StartUp = Startup chat room. Chatter is added to this after he logs in.

5

इसे बस क्लासपाथ में होना चाहिए (उर्फ यह सुनिश्चित करें कि यह / WEB-INF / कक्षाओं के तहत समाप्त होता है। बिल्ड के भाग के रूप में .war)।


इस विचार के लिए धन्यवाद, लेकिन यह मुझे बताता है कि फ़ाइल को निर्दिष्ट नहीं किया जा सकता है, हाँ इसका पथ समस्या कैसे रास्ता दे
sansknwoledge

3

आप अपने स्रोत फ़ोल्डर के साथ कर सकते हैं ताकि जब भी आप निर्माण करते हैं, तो वे फाइलें स्वचालित रूप से कक्षाओं निर्देशिका में कॉपी की जाती हैं।

गुण फ़ाइल का उपयोग करने के बजाय, XML फ़ाइल का उपयोग करें।

यदि डेटा बहुत छोटा है, तो आप संपत्तियों तक पहुँचने के लिए web.xml का भी उपयोग कर सकते हैं।

कृपया ध्यान दें कि इनमें से किसी भी दृष्टिकोण को प्रतिबिंबित किए जाने वाले परिवर्तनों के लिए ऐप सर्वर पुनरारंभ की आवश्यकता होगी।


मैंने वेबपृष्ठ फ़ोल्डर में रखा है, लेकिन इसे एक्सेस करने में असमर्थ फ़ाइल को नहीं मिला त्रुटि आ रही है कि कैसे सेट किया जाए
sansknwoledge

1
यदि आपकी फ़ाइल WEB-INF / क्लासेस फ़ोल्डर में समाप्त हो जाती है, तो यह स्वतः ही क्लासपाथ में सेट हो जाती है
कल्पांक

2

मान लें कि आपका कोड फ़ाइल को app.properties कह रहा है। इस फाइल को किसी भी डीआरआर पर कॉपी करें और इस डीआईआर को क्लासपैथ में जोड़ें, टॉमकैट के बिन डायर में एक setenv.sh बनाकर।

Tomcat के आपके setenv.sh में (यदि यह फ़ाइल मौजूद नहीं है, तो एक बनाएँ, tomcat इस setenv.sh फ़ाइल को लोड कर देगा। #!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"

आपको अपनी प्रॉपर्टीज़ फ़ाइलों में नहीं होनी चाहिए ।/webapps//WEB-INF/classes/app.protties

WEB-INF / वर्गों / से एक के साथ ओवरराइड करेगा टोमाकट क्लास लोडर

एक अच्छा पढ़ा: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

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