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

StackOverflow https://stackoverflow.com/questions/96247

سؤال

أقوم بإنشاء تطبيق ويب (WAR) ونشره على Tomcat.في ال التطبيق على شبكة الإنترنت توجد صفحة تحتوي على نموذج حيث يمكن للمسؤول إدخال بعض بيانات التكوين.لا أريد تخزين هذه البيانات في نظام إدارة قواعد البيانات (DBMS)، ولكن فقط في ملف XML على نظام الملفات.أين تضعه؟

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

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

هل كانت مفيدة؟

المحلول

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

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

سيكون من الجيد تخزين كل شيء في قاعدة البيانات، ولكن من الواضح أنه لا يمكنك تخزين معلومات اتصال قاعدة البيانات في قاعدة البيانات.

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

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

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

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

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

نصائح أخرى

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

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")

وضعه في WEB-INF سيخفي ملف XML عن المستخدمين الذين يحاولون الوصول إليه مباشرة من خلال عنوان URL، لذلك نعم، أود أن أضعه فيه WEB-INF.

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

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

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

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

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top