এটা তোমার পছন্দ. একটি জাভা ওয়েব অ্যাপ্লিকেশন সংরক্ষণাগার (ওয়ার) এ মূলত তিনটি উপায় রয়েছে:
1. এটি ক্লাসপথে রাখুন
যাতে আপনি এটি ClassLoader#getResourceAsStream()
ক্লাসপথ-আপেক্ষিক পথ দিয়ে লোড করতে পারেন :
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
এখানে foo.properties
কোনও শিকড় স্থাপন করার কথা রয়েছে যা কোনও ওয়েবঅ্যাপের ডিফল্ট ক্লাসপথ দ্বারা আচ্ছাদিত, যেমন ওয়েব অ্যাপস /WEB-INF/lib
এবং /WEB-INF/classes
সার্ভারের /lib
, বা জেডিকে / জেআরই'র /lib
। যদি বৈশিষ্ট্য ফাইলটি ওয়েব অ্যাপ্লিকেশন-নির্দিষ্ট হয় তবে এটিকে রাখা ভাল /WEB-INF/classes
। যদি আপনি কোনও আইডিইতে একটি স্ট্যান্ডার্ড ওয়ার প্রকল্পটি বিকাশ করে থাকেন তবে এটি 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");
// ...
যাইহোক, বৈশিষ্ট্যগুলির ফাইলের দৃশ্যমানতা তখন প্রশ্নযুক্ত শ্রেণি লোডারটির উপর নির্ভর করে। এটি কেবল শ্রেণীর লোডের মতো একই শ্রেণির লোডারকে দৃশ্যমান। সুতরাং, যদি ক্লাসটি ওয়েব অ্যাপ্লিকেশন ক্লাসলোডারের পরিবর্তে সার্ভারের সাধারণ ক্লাসলোডার দ্বারা লোড করা থাকে এবং বৈশিষ্ট্যগুলি ফাইলটি ওয়েব অ্যাপের মধ্যে থাকে তবে এটি অদৃশ্য। প্রসঙ্গ শ্রেণীর লোডারটি আপনার নিরাপদ বাজি তাই আপনি ক্লাসপথে "সর্বত্র" বৈশিষ্ট্য ফাইলটি রাখতে পারেন এবং / অথবা আপনি ওয়েব অ্যাপ্লিকেশন থেকে একটি সার্ভার-সরবরাহিত একটি ওভাররাইড করতে সক্ষম হতে চান।
2. এটি ওয়েব কনটেন্টে রাখুন
যাতে আপনি এটি ওয়েব ServletContext#getResourceAsStream()
কনটেন্ট-আপেক্ষিক পাথ দিয়ে লোড করতে পারেন :
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
নোট করুন যে আমি ফাইলটি /WEB-INF
ফোল্ডারে রাখার জন্য প্রদর্শন করেছি , অন্যথায় এটি কোনও ওয়েব ব্রাউজার দ্বারা সর্বজনীনভাবে অ্যাক্সেসযোগ্য হত। এছাড়াও মনে রাখবেন ServletContext
কোনো রয়েছে HttpServlet
বর্গ শুধু উত্তরাধিকারসূত্রে দ্বারা অ্যাক্সেসযোগ্য GenericServlet#getServletContext()
এবং Filter
দ্বারা FilterConfig#getServletContext()
। আপনি যদি কোনও সার্লেট ক্লাসে না থাকেন তবে এটি সাধারণত ইনজেকশনযোগ্য @Inject
।
৩. এটি স্থানীয় ডিস্ক ফাইল সিস্টেমে রাখুন
যাতে আপনি এটি java.io
একটি পরম স্থানীয় ডিস্ক ফাইল সিস্টেমের পাথ দিয়ে স্বাভাবিকভাবে লোড করতে পারেন :
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
একটি নিখুঁত পাথ ব্যবহার করার গুরুত্ব নোট করুন। আপেক্ষিক স্থানীয় ডিস্ক ফাইল সিস্টেমের পাথগুলি জাভা EE ওয়েব অ্যাপ্লিকেশনটিতে একেবারে চলবে না। নীচে প্রথম "আরও দেখুন" লিঙ্কটিও দেখুন।
কোনটি বেছে নেবে?
রক্ষণাবেক্ষণের নিজের মতামতটিতে সুবিধাগুলি / অসুবিধাগুলি কেবল বিবেচনা করুন ।
যদি সম্পত্তি ফাইলগুলি "স্থিতিশীল" হয় এবং রানটাইমের সময় কখনও পরিবর্তন করার প্রয়োজন হয় না, তবে আপনি সেগুলি ওয়ারে রাখতে পারেন।
আপনি যদি প্রতিবার WAR পুনর্নির্মাণ এবং পুনরায় প্রচারের প্রয়োজন ছাড়াই ওয়েব অ্যাপ্লিকেশনটির বাইরে থেকে বৈশিষ্ট্যযুক্ত ফাইলগুলি সম্পাদনা করতে পছন্দ করেন তবে প্রকল্পের বাইরের শ্রেণিপথে রাখুন (প্রয়োজনে ডিরেক্টরিটি শ্রেণিপথের সাথে যুক্ত করুন)।
আপনি যদি Properties#store()
পদ্ধতিটি ব্যবহার করে ওয়েব অ্যাপ্লিকেশনটির অভ্যন্তর থেকে প্রোগ্রামগুলি সম্পত্তি ফাইল সম্পাদনা করতে পছন্দ করেন তবে এটিকে ওয়েব অ্যাপ্লিকেশনের বাইরে রাখুন। যেহেতু এর Properties#store()
প্রয়োজন হয় Writer
, আপনি ডিস্ক ফাইল সিস্টেমের পথ ব্যবহার করে ঘুরতে পারবেন না। সেই পথটি পরিবর্তে কোনও ভিএম যুক্তি বা সিস্টেম সম্পত্তি হিসাবে ওয়েব অ্যাপ্লিকেশনটিতে যেতে পারে। সতর্কতা হিসাবে কখনও ব্যবহার করবেন নাgetRealPath()
। মোছা ফোল্ডারে থাকা সমস্ত পরিবর্তনগুলি রিডপ্লয়েতে হারিয়ে যাবে এমন সাধারণ কারণের জন্য যে পরিবর্তনগুলি মূল ওয়ার ফাইলটিতে ফিরে আসে না।
আরো দেখুন: