जावा वेब एप्लिकेशन (डब्ल्यूएआर) में कॉन्फ़िगरेशन फ़ाइल को स्टोर करने के लिए सबसे अच्छी जगह क्या है?

मैं एक वेब एप्लिकेशन (डब्ल्यूएआर) बनाता हूं और इसे टॉमकैट पर तैनात करता हूं। वेबएप में एक ऐसा पृष्ठ है जहां एक व्यवस्थापक कुछ कॉन्फ़िगरेशन डेटा दर्ज कर सकता है। मैं इस डेटा को डीबीएमएस में स्टोर नहीं करना चाहता, लेकिन फाइल सिस्टम पर सिर्फ एक एक्सएमएल फ़ाइल में। इसे कहां रखा जाए?

मैं फ़ाइल को कहीं भी निर्देशिका पेड़ में रखना चाहता हूं जहां एप्लिकेशन स्वयं तैनात किया गया है। क्या मेरी कॉन्फ़िगरेशन फ़ाइल WEB-INF निर्देशिका में होनी चाहिए? या इसे कहीं और रखो?

और निर्देशिका के पूर्ण पथ को खोजने के लिए सर्वलेट में उपयोग करने के लिए जावा कोड क्या है? या इसे एक सापेक्ष पथ से पहुंचा जा सकता है?

0
ध्यान दें कि सर्वलेट इंजन के लिए कोई डिफ़ॉल्ट तंत्र नहीं है - आपको विक्रेता विशिष्ट मान्यताओं को बनाने की आवश्यकता होगी।
जोड़ा लेखक Thorbjørn Ravn Andersen, स्रोत

6 उत्तर

यदि यह आपकी कस्टम कॉन्फ़िगरेशन है तो वेब-आईएनएफ इसके लिए एक अच्छी जगह है। लेकिन कुछ पुस्तकालयों को वेब-आईएनएफ/कक्षाओं में रहने के लिए कॉन्फ़िगरेशन की आवश्यकता हो सकती है।

0
जोड़ा

इसे WEB-INF में डालकर उन उपयोगकर्ताओं से एक्सएमएल फ़ाइल छिपाएगी जो सीधे यूआरएल के माध्यम से इसे एक्सेस करने का प्रयास करते हैं, इसलिए हाँ, मैं कहूंगा कि इसे WEB-INF

0
जोड़ा

मैं इसे एप्लिकेशन फ़ोल्डर में संग्रहीत नहीं करता, क्योंकि यह एप्लिकेशन की एक नई तैनाती के साथ कॉन्फ़िगरेशन को ओवरराइड करेगा।

मेरा सुझाव है कि आप प्राथमिकता API पर एक नज़र डालें, या उपयोगकर्ता फ़ोल्डर में कुछ लिखें (उपयोगकर्ता जो टोमकैट चला रहा है)।

0
जोड़ा

इसका उत्तर इस कॉन्फ़िगरेशन फ़ाइल को पढ़ने और लिखने का इरादा इस बात पर निर्भर करता है।

उदाहरण के लिए, स्प्रिंग फ्रेमवर्क आपको एक्सएमएल विन्यास फाइलों का उपयोग करें (या जावा संपत्ति फाइलें); इन्हें आपके क्लासपाथ में संग्रहीत किया जा सकता है (उदा।, वेब-आईएनएफ निर्देशिका में), फाइल सिस्टम पर कहीं भी, या यहां तक ​​कि स्मृति में भी। यदि आप इसके लिए स्प्रिंग का उपयोग करना चाहते थे, तो कॉन्फ़िगरेशन फ़ाइल को स्टोर करने का सबसे आसान स्थान आपकी वेब-आईएनएफ निर्देशिका में है, और फिर स्प्रिंग के ClassPathXmlAplicationContext वर्ग।

लेकिन फिर, यह सब इस बात पर निर्भर करता है कि आप उस फ़ाइल तक पहुंचने की योजना कैसे बनाते हैं।

0
जोड़ा

हम सर्वर पर एक अलग निर्देशिका में डालने के लिए क्या करते हैं (आप कुछ/config,/opt/config,/root/config,/home/username/config, या जो कुछ भी आप चाहते हैं) का उपयोग कर सकते हैं। जब हमारे servlets शुरू होते हैं, वे एक्सएमएल फ़ाइल पढ़ते हैं, इसमें से कुछ चीजें प्राप्त करें (सबसे महत्वपूर्ण रूप से डीबी कनेक्शन जानकारी), और यही वह है।

मैंने पूछा कि हमने यह क्यों किया।

डीबी में सबकुछ स्टोर करना अच्छा लगेगा, लेकिन जाहिर है कि आप डीबी में डीबी कनेक्शन की जानकारी स्टोर नहीं कर सकते हैं।

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

WAR फ़ाइल में चीजें डालना अच्छा लगता है, लेकिन यदि आप चीजों को बदलना चाहते हैं तो यह एक बुरा विचार हो सकता है। समस्या यह है कि यदि आपको जानकारी बदलनी है, तो अगली बार जब आप पुन: नियोजित करेंगे तो यह फ़ाइल को ओवरराइट कर देगा, इसलिए WAR में बनाए गए संस्करण में बदलने के लिए आपको याद नहीं आया है।

फाइल सिस्टम चीज पर एक विशेष स्थान पर फ़ाइल हमारे लिए काफी अच्छी तरह से काम करती है। इसमें कोई बड़ी डाउनसाइड्स नहीं है। आप जानते हैं कि यह कहां है, यह अलग-अलग संग्रहीत है, कई मशीनों को तैनात करने में आसान बनाता है अगर उन्हें सभी को अलग-अलग कॉन्फ़िगरेशन मानों की आवश्यकता होती है (क्योंकि यह WAR का हिस्सा नहीं है)।

एकमात्र अन्य समाधान जो मैं सोच सकता हूं कि अच्छी तरह से काम करेगा डीबी लॉगिन जानकारी को छोड़कर डीबी में सब कुछ रखेगा। यह जावा सिस्टम गुणों से आएगा जो JVM के माध्यम से पुनर्प्राप्त किए जाते हैं। यह प्राथमिकता एपीआई चीज ऊपर हंस डॉगजेन द्वारा उल्लिखित है। मुझे नहीं लगता कि यह तब था जब हमारे आवेदन को पहले विकसित किया गया था, अगर इसका इस्तेमाल नहीं किया गया था।

कॉन्फ़िगरेशन फ़ाइल तक पहुंचने के लिए पथ के लिए, यह फाइल सिस्टम पर सिर्फ एक फ़ाइल है। आपको वेब पथ के बारे में चिंता करने की आवश्यकता नहीं है। तो जब आपका सर्वलेट शुरू होता है तो यह फ़ाइल को "/config/myapp/config.xml" (या जो कुछ भी) पर खुलता है और यह सही चीज़ मिल जाएगा। इस के लिए पथ को बस हार्डकोड करना मेरे लिए बहुत हानिकारक लगता है।

0
जोड़ा
जब टॉमकैट शुरू होता है तो हम सिस्टम प्रॉपर्टी निर्दिष्ट करते हैं। हमारे ऐप को इस सिस्टम प्रॉपर्टी से हमारी कॉन्फ़िगरेशन निर्देशिका मिलती है, इसलिए हम सर्वर से सर्वर पर एक अलग कॉन्फ़िगरेशन निर्देशिका का उपयोग कर सकते हैं।
जोड़ा लेखक ScArcher2, स्रोत
यदि आपके पास एक ही टोमकैट में चलने वाले एकाधिक वातावरण (जैसे परीक्षण और स्टेजिंग) चल रहे हैं तो यह कैसे काम करेगा? चूंकि आप केवल एक टोमकैट होने पर प्रति माह सिस्टम प्रॉपर्टी निर्दिष्ट नहीं कर सकते हैं।
जोड़ा लेखक AtliB, स्रोत
आपके सुझावों के लिए धन्यवाद। वे मेरे लिए बहुत उपयोगी हैं।
जोड़ा लेखक boes, स्रोत
फ़ाइल के पूर्ण पथ को संदर्भित करने के बजाय आप सर्वर के लिए क्लासपाथ पर "कॉन्फ़िगरेशन" निर्देशिका डाल सकते हैं और केवल ClassLoader.getResource() का उपयोग कर सकते हैं।
जोड़ा लेखक John Meagher, स्रोत
यह हमारे लिए भी काम करता है, लेकिन यदि आप कभी-कभी विंडोज़ पर तैनाती करते हैं, तो यह दर्द हो सकता है, जहां इसे जोड़ने/पसंद करने के लिए प्राकृतिक नहीं है।
जोड़ा लेखक Peter Hilton, स्रोत
बस एक छोटी टिप्पणी: फाइल सिस्टम पदानुक्रम गाइड के अनुसार tldp.org /LDP/Linux-Filesystem-Hierarchy/html/opt.html , सभी फ़ाइलों को/opt/'package'/config के अंतर्गत जाना चाहिए जहां 'पैकेज' आपके प्रोग्राम का नाम है।
जोड़ा लेखक milan, स्रोत
@ पीटर: मेरा देव सेटअप विंडोज पर था। मैंने अभी सी से अपने बॉक्स पर निर्देशिका बनाई है ताकि जब एप्लिकेशन "/ config" के लिए पूछा जाए, तो उसे सही निर्देशिका मिल जाएगी। यह काफी अच्छा काम किया।
जोड़ा लेखक MBCook, स्रोत
@ जॉन: यह वास्तव में एक बहुत अच्छा विचार है, जब मैं वहां गया तो यह बस सेटअप था।
जोड़ा लेखक MBCook, स्रोत
एप्लिकेशन में मैं वर्तमान में काम कर रहा हूं कि हम USER_HOME निर्देशिका में स्थित फ़ोल्डर में एप्लिकेशन के बाहर कॉन्फ़िगरेशन फ़ाइल संग्रहीत कर रहे हैं। और स्टार्टअप पर, एप्लिकेशन को स्थान से फ़ाइल मिलती है स्ट्रिंग पूर्ण कॉनफिगपैथ = System.getProperty ("user.home") + File.separator + ".myapp" + File.separator + "config.xml";
जोड़ा लेखक Nikola, स्रोत
@MBCook आपकी टिप्पणी के लिए धन्यवाद। इसने मेरे संदेहों को मंजूरी दे दी है।
जोड़ा लेखक Vimal Panchal, स्रोत

वेब कॉन्फ़िगरेशन फ़ाइल डालने के लिए वेब-आईएनएफ एक अच्छी जगह है। सर्वलेट से निर्देशिका का पूर्ण पथ प्राप्त करने के लिए यहां कुछ कोड दिया गया है।

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
0
जोड़ा
यह एक संगत दृष्टिकोण नहीं है - यह सर्वलेट spec द्वारा गारंटी नहीं है जो getRealPath() एक वैध (गैर-शून्य) पथ लौटाएगा या यहां तक ​​कि युद्ध बिल्कुल अनपॅक किया जाएगा (IMHO, Weblogic .war से फ़ाइलों को निकालने नहीं देगा डिस्क)।
जोड़ा लेखक MRalwasser, स्रोत
यह बिल्कुल अच्छा दृष्टिकोण नहीं है!
जोड़ा लेखक Gewure, स्रोत
यदि आपके पास एक देव, परीक्षण, प्री-प्रोड और प्रोड पर्यावरण है, तो यह काम नहीं करेगा, क्योंकि आपको प्रत्येक पर्यावरण के लिए एक व्यक्ति की जरूरत होगी। आप एक बार कॉन्फ़िगरेशन को तैनात करने में सक्षम होना चाहिए, और उसके बाद वातावरण के माध्यम से एक ही युद्ध का प्रचार करना चाहिए ...
जोड़ा लेखक Tom Chamberlain, स्रोत