ما هو أفضل مكان لتخزين ملف التكوين في تطبيق ويب Java (WAR)؟

I create a web application (WAR) and deploy it on Tomcat. In the webapp there is a page with a form where an administrator can enter some configuration data. I don't want to store this data in an DBMS, but just in an xml file on the file system. Where to put it?

أرغب في وضع الملف في مكان ما في شجرة الدليل حيث يتم نشر التطبيق نفسه. هل يجب أن يكون ملف التكوين الخاص بي في دليل WEB-INF ؟ أو وضعها في مكان آخر؟

وما هو كود جافا المراد استخدامه في servlet للعثور على المسار المطلق للدليل؟ أو يمكن الوصول إليه بمسار نسبي؟

0
وأضاف تحرير
الآراء: 1
لاحظ أنه لا توجد آلية افتراضية لمحركات servlet - ستحتاج إلى تقديم افتراضات محددة للبائع.
وأضاف المؤلف Thorbjørn Ravn Andersen, مصدر

6 إجابة

إذا كان التكوين المخصص الخاص بك WEB-INF هو مكان جيد لذلك. ولكن قد تتطلب بعض المكتبات تكوينًا في WEB-INF/classes.

0
وأضاف

سيؤدي إخراجه في WEB-INF إلى إخفاء ملف xml من المستخدمين الذين يحاولون الوصول إليه مباشرة من خلال عنوان URL ، لذلك نعم ، يمكنني قول ذلك في WEB-INF .

0
وأضاف

لن أقوم بتخزينها في مجلد التطبيق ، لأن ذلك سيتجاوز التكوين مع عملية نشر جديدة للتطبيق.

أقترح عليك إلقاء نظرة على Preferences API ، أو كتابة شيء ما في مجلد المستخدمين (المستخدم الذي يقوم بتشغيل Tomcat).

0
وأضاف

تعتمد الإجابة على هذا على الطريقة التي تنوي قراءة وكتابة ملف التهيئة هذا.

على سبيل المثال ، يمنحك إطار عمل Spring القدرة على تستخدم ملفات تهيئة xml (أو ملفات خصائص Java)؛ يمكن تخزينها في صفك (على سبيل المثال ، في دليل WEB-INF) ، أو في أي مكان آخر في نظام الملفات ، أو حتى في الذاكرة. إذا كنت تستخدم Spring لهذا ، فإن أسهل مكان لتخزين ملف config موجود في دليل WEB-INF ، ثم استخدم Spring's ClassPathXmlApplicationContext للوصول إلى ملف التكوين الخاص بك.

ولكن مرة أخرى ، يعتمد الأمر كله على كيفية التخطيط للوصول إلى هذا الملف.

0
وأضاف

ما نقوم به هو وضعه في دليل منفصل على الخادم (يمكنك استخدام شيء مثل/config ،/opt/config ،/root/config ،/home/username/config ، أو أي شيء تريده). عندما تبدأ servlets لدينا ، يقرأون ملف xml ، يحصلون على بعض الأشياء منه (معلومات اتصال DB الأكثر أهمية) ، وهذا كل شيء.

سألت عن سبب فعلنا هذا مرة واحدة.

سيكون من الأفضل تخزين كل شيء في DB ، لكن من الواضح أنه لا يمكنك تخزين معلومات اتصال DB في DB.

يمكن أن ترسي الأشياء في الشفرة ، لكن هذا قبيح لأسباب عديدة. إذا كان على أي وقت مضى تغيير المعلومات لديك لإعادة بناء التعليمات البرمجية وإعادة الانتشار. إذا حصل شخص ما على نسخة من شفرتك أو ملف WAR الخاص بك ، فسوف تحصل على تلك المعلومات.

يبدو أن وضع الأشياء في ملف WAR جيد ، لكن إذا أردت تغيير أشياء كثيرة ، فقد تكون فكرة سيئة. تكمن المشكلة في أنه إذا كان عليك تغيير المعلومات ، فستقوم في المرة القادمة بإعادة نشرها بالكتابة فوق الملف بحيث يتم نسيان أي شيء لم تتذكر تغييره في النسخة التي تم دمجها في WAR.

الملف في مكان خاص على شيء نظام الملفات يعمل بشكل جيد بالنسبة لنا. ليس لديها أي سلبيات كبيرة. أنت تعرف مكانها ، يتم تخزينها بشكل منفصل ، يجعل النشر إلى عدة أجهزة أمرًا سهلاً إذا كانت جميعها بحاجة إلى قيم تهيئة مختلفة (لأنها ليست جزءًا من WAR).

والحل الآخر الوحيد الذي يمكنني التفكير فيه سيكون جيدًا هو الاحتفاظ بكل شيء في DB باستثناء معلومات تسجيل الدخول إلى DB. من شأنه أن يأتي من خصائص نظام جافا التي يتم استرجاعها من خلال JVM. هذا الشيء Preferences API المذكور بواسطة Hans Doggen أعلاه. لا أعتقد أنه كان موجودًا عندما تم تطوير طلبنا لأول مرة ، إذا لم يكن قد تم استخدامه.

أما بالنسبة لمسار الوصول إلى ملف التكوين ، فهو مجرد ملف في نظام الملفات. لا داعي للقلق بشأن مسار الويب. لذلك عندما يبدأ servlet الخاص بك فقط يفتح الملف في "/config/myapp/config.xml" (أو أيا كان) ، وسوف تجد الشيء الصحيح. إن مجرد تعديل المسار في هذا البرنامج يبدو غير ضار بالنسبة لي.

0
وأضاف
نحدد خاصية نظام عند بدء تشغيل tomcat. يحصل تطبيقنا على دليل التكوين الخاص بنا من خاصية النظام هذه ، حتى نتمكن من استخدام دليل تكوين مختلف من خادم إلى خادم.
وأضاف المؤلف ScArcher2, مصدر
كيف يعمل هذا إذا كان لديك بيئات متعددة (مثل الاختبار والتدريج) تعمل في نفس القط؟ نظرًا لأنك لا تستطيع تحديد خاصية نظام لكل بيئة عندما يكون لديك قط واحد فقط.
وأضاف المؤلف AtliB, مصدر
شكرا على اقتراحاتك. هم مفيدة جدا بالنسبة لي.
وأضاف المؤلف boes, مصدر
بدلاً من الإشارة إلى المسار الكامل إلى الملف ، يمكنك وضع دليل "config" على مسار classpath للملقم واستخدام ClassLoader.getResource() فقط.
وأضاف المؤلف John Meagher, مصدر
هذا الأمر مفيد لنا أيضًا ، ولكن قد يكون من الألم إذا كنت تنشر من وقت لآخر على Windows ، حيث لا يكون من الطبيعي إضافة/اختيار وما شابه.
وأضاف المؤلف Peter Hilton, مصدر
مجرد ملاحظة صغيرة: وفقًا لدليل هرمي نظام الملفات tldp.org /LDP/Linux-Filesystem-Hierarchy/html/opt.html ، يجب أن تكون جميع الملفات ضمن/opt/'package'/config حيث 'package' هو اسم البرنامج الخاص بك.
وأضاف المؤلف milan, مصدر
Peter: كان إعداد مطوري على Windows. أنا فقط خلقت الدليل على مربع بلدي قبالة C بحيث عندما طلب التطبيق "/ config" ، فإنه من الحصول على الدليل الصحيح. عملت بشكل جيد.
وأضاف المؤلف MBCook, مصدر
John: هذا في الواقع فكرة جيدة ، وكان هذا ببساطة الإعداد عندما وصلت هناك.
وأضاف المؤلف MBCook, مصدر
في التطبيق ، أعمل حاليًا على تخزين ملف تهيئة خارج التطبيق في مجلد موجود في دليل USER_HOME. وعند بدء التشغيل ، يحصل التطبيق على الملف من الموقع String absoluteConfigPath = System.getProperty ("user.home") + File.separator + ".myapp" + File.separator + "config.xml"؛
وأضاف المؤلف Nikola, مصدر
MBCook نشكرك على تعليقك. وقد طهرت شكوكي.
وأضاف المؤلف Vimal Panchal, مصدر

WEB-INF هو مكان جيد لوضع ملف التكوين الخاص بك. إليك بعض التعليمات البرمجية للحصول على المسار المطلق للدليل من servlet.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
0
وأضاف
هذا ليس أسلوبًا متوافقًا - إنه ليس مضمونًا من خلال مواصفات servlet التي ستقوم getRealPath() بإرجاع مسار صالح (غير فارغ) أو حتى أن يتم فك الحرب على الإطلاق (IMHO ، لن يقوم Weblogic باستخراج الملفات من .war إلى القرص).
وأضاف المؤلف MRalwasser, مصدر
هذا ليس نهجا جيدا على الاطلاق!
وأضاف المؤلف Gewure, مصدر
لن يعمل هذا إذا كان لديك بيئة التطوير والاختبار و pre-prod و prod ، كما تحتاج إلى .war لكل بيئة. يجب أن تكون قادرًا على نشر التهيئة مرة واحدة ، ثم نشر نفس الحرب من خلال البيئات ...
وأضاف المؤلف Tom Chamberlain, مصدر