সার্লেলেট ভিত্তিক অ্যাপ্লিকেশনটিতে কনফিগারেশন রিসোর্স ফাইলগুলি কোথায় রাখবেন এবং কীভাবে পড়বেন?


222

আমার ওয়েব অ্যাপ্লিকেশনটিতে আমাকে পূর্বনির্ধারিত ব্যবহারকারীদের পছন্দ মতো সেট করতে ইমেল প্রেরণ করতে হবে finance@xyz.com, তাই আমি .propertiesএটিকে একটি ফাইলে যুক্ত করতে এবং প্রয়োজনে এটি অ্যাক্সেস করতে চাই। এটি কি সঠিক পদ্ধতি, যদি তাই হয় তবে আমার এই ফাইলটি কোথায় রাখা উচিত? আমি নেটবিয়ান আইডিই ব্যবহার করছি যা উত্স এবং জেএসপি ফাইলগুলির জন্য দুটি পৃথক ফোল্ডার রাখে।


জেএনডিআই সম্ভবত সমাধান হতে পারে?
বেসিল Bourque

উত্তর:


464

এটা তোমার পছন্দ. একটি জাভা ওয়েব অ্যাপ্লিকেশন সংরক্ষণাগার (ওয়ার) এ মূলত তিনটি উপায় রয়েছে:


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() । মোছা ফোল্ডারে থাকা সমস্ত পরিবর্তনগুলি রিডপ্লয়েতে হারিয়ে যাবে এমন সাধারণ কারণের জন্য যে পরিবর্তনগুলি মূল ওয়ার ফাইলটিতে ফিরে আসে না।

আরো দেখুন:


2
"আমি ব্যক্তিগতভাবে এটিকে প্রকল্পের বাইরে ক্লাসপথে স্থাপন করা পছন্দ করি (ক্লাসপথে নতুন পথ যুক্ত করুন)" বিভ্রান্ত, আপনি উদাহরণ দিতে পারেন?
খালি

4
@ ব্লাঙ্কম্যান তাঁর সম্ভবত একটি নতুন ফোল্ডার তৈরি করা, আপনার সমস্ত কাস্টম কনফিগারেশন ফাইল সেখানে রেখে এবং সেই ফোল্ডারটিকে ক্লাসপথে যুক্ত করা উচিত। সুতরাং: 1) কোথাও 'appconfs' নামে একটি ফোল্ডার তৈরি করুন (এমনকি /etc/appconfs2 এমনকি হতে পারে ) অ্যাপ্লিকেশন সার্ভার / ডোমেনের শ্রেণিপথে সেই ফোল্ডারটি যুক্ত করুন। দ্বিতীয় ধাপটি অ্যাপ্লিকেশন সার্ভার নির্দিষ্ট, আমি মনে করি না যে এর জন্য জেনেরিক উদাহরণ রয়েছে।
টুউকা মস্তোনেন

পুনরায়: 2: কেন উভয় "WEB-INF/filename.properties"এবং "/WEB-INF/filename.properties"( /শুরুতে লক্ষ্য করুন ) কাজ করবে? একে অপরের চেয়ে বেশি পছন্দ করার কোনও কারণ আছে কি?
মিস্টার_আর_আমস_ডি

আমি গত একদিন ধরে এই সমস্যাটিতে স্থির হয়েছি। আমি আমার সম্পত্তি ফাইল লোড করতে সক্ষম নই। আমি এটি দুটি জায়গা থেকে লোড করতে সক্ষম। একটি সিস্টেম ডিরেক্টরি এবং একটি স্থানীয় ড্রাইভ। এটি লোকালহোস্টের সাথে কাজ করে। তবে আমি এটি অ্যামাজনে স্থাপন করতে চাই।
অরুণ রাজা

আমি নেটবিয়ান আইডিই ব্যবহার করছি এবং প্রোপার্টি ফাইলটি ওয়েব পৃষ্ঠা / সংস্থানগুলিতে রাখি। আমি এটি "./Web পৃষ্ঠাগুলি / সংস্থানগুলি / config.properties" হিসাবে অ্যাক্সেস করার চেষ্টা করি। আমি এটি অ্যাক্সেস করতে সক্ষম নই। আমাকে সাহায্য করুন.
অরুণ রাজা

9

সতর্কতার শব্দ: আপনি যদি আপনার WEB-INF/classesফোল্ডারে কনফিগার ফাইল রাখেন এবং আপনার আইডিই, এক্লিপস বলে, একটি পরিষ্কার / পুনর্নির্মাণ করে, এটি জাভা উত্স ডিরেক্টরিতে না থাকলে আপনার কনফার্ট ফাইলগুলিকে নাক করে দেবে। বালুসসির দুর্দান্ত উত্তরটি বিকল্প 1 এ প্রমাণ করে তবে আমি জোর যুক্ত করতে চেয়েছিলাম।

আমি কঠোরভাবে শিখেছি যে আপনি যদি একটিগ্রহের একটি ওয়েব প্রকল্প "কপি" করেন তবে এটি কোনও উত্স ফোল্ডার থেকে একটি পরিষ্কার / পুনর্নির্মাণ করে। আমার ক্ষেত্রে আমি আমাদের POJO জাভা লাইব্রেরি থেকে একটি "লিঙ্কযুক্ত উত্স দির" যুক্ত করেছি, এটি WEB-INF/classesফোল্ডারে সংকলন করবে । প্রকল্পটিতে একটি পরিষ্কার / পুনর্নির্মাণ করা (ওয়েব অ্যাপ্লিকেশন প্রকল্প নয়) একই সমস্যা তৈরি করেছে।

আমি আমার কনফারেন্সগুলি পোজো এসসিআর ফোল্ডারে রাখার কথা ভেবেছিলাম, তবে এই কনফারেন্সগুলি সমস্ত ফোল্ডারে থাকা তৃতীয় পক্ষের লিবসের (যেমন কোয়ার্টজ বা ইউআরএলআরাইট্রাইট) এর জন্য WEB-INF/lib, তাই এটির কোনও অর্থ হয়নি। আমি যখন এটি কাছাকাছি আসব তখন এটি ওয়েব প্রোজেক্ট "src" ফোল্ডারে রাখার পরীক্ষা করার পরিকল্পনা করি, তবে সেই ফোল্ডারটি বর্তমানে খালি রয়েছে এবং এতে কনফারেন্স ফাইলগুলি অসম্পূর্ণ বলে মনে হচ্ছে।

মধ্যে সার্ভার ফাইল নির্বাণ জন্য আমি ভোট সুতরাং WEB-INF/commonConfFolder/filename.properties, পরবর্তী ক্লাস ফোল্ডারের, যা Balus বিকল্প 2 প্রত্যাবর্তন করতে হবে।


1
আপনি যদি নিজের কনফিগারেশন ফাইলটিকে WEB_INF এর একটি সাব ফোল্ডারে রেখে দেন তবে আপনি কীভাবে এটি পৌঁছবেন? 'কনফিগার ফাইল / প্রোপ্রেটিস' বলতে আমার ভাগ্য হয়নি
জেসিবয়েড

ঠিক আছে, এটি 'জাভা রিসোর্স / এসসিআর /' এর অধীনে সম্পত্তি ফাইলটি স্থাপন করে যা আমার প্যাকেজগুলির মধ্যে একটির থেকে কাজ করে না এবং এটি এসআরসি-র মূল হতে হবে। ক্লাস ফোল্ডারটি কমে যাওয়া সম্পর্কে আপনার সতর্কতা একটি বৈধ উদ্বেগ।
জেসিবয়েড

6

উদাহরণ: ওয়েব.এক্সএমএল-তে ট্যাগ ফাইল file

<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

এটি কেবল ক্লাসপথে থাকতে হবে (এটি নিশ্চিত করুন যে এটি বিল্ডের অংশ হিসাবে .Wwar মধ্যে / WEB-INF / ক্লাসগুলির মধ্যে শেষ হয়েছে)।


হাই ধারণা দেওয়ার জন্য ধন্যবাদ, কিন্তু এটা আমার বলে যে নির্বাচিত ফাইল খুঁজে পাচ্ছি না, হ্যাঁ তার পাথ সমস্যা কিভাবে পাথ দিতে
sansknwoledge

3

আপনি আপনার উত্স ফোল্ডারটি দিয়ে করতে পারেন তাই আপনি যখনই নির্মাণ করবেন তখন এই ফাইলগুলি স্বয়ংক্রিয়ভাবে ক্লাস ডিরেক্টরিতে অনুলিপি করা হয়।

বৈশিষ্ট্য ফাইল ব্যবহার করার পরিবর্তে, এক্সএমএল ফাইলটি ব্যবহার করুন।

যদি ডেটা খুব ছোট হয় তবে আপনি বৈশিষ্ট্য অ্যাক্সেসের জন্য ওয়েব.এক্সএমএল ব্যবহার করতে পারেন।

দয়া করে নোট করুন যে এগুলির মধ্যে যে কোনও একটিতে পরিবর্তনগুলি প্রতিফলিত হওয়ার জন্য অ্যাপ্লিকেশন সার্ভার পুনরায় চালু করতে হবে।


আমি ওয়েবপৃষ্ঠাগুলি ফোল্ডারে
রেখেছি

1
যদি আপনার ফাইল ওয়েব-INF শেষ পর্যন্ত / শ্রেণীর ফোল্ডারে, এটি স্বয়ংক্রিয়ভাবে ক্লাসপাথ মধ্যে সেট করা হয়
কাল্পাক

2

ধরে নিন আপনার কোডটি অ্যাপ.প্রপ্রেটিস বলে ফাইলটির সন্ধান করছে। এই ফাইলটি যে কোনও ডিয়ারে অনুলিপি করুন এবং টমক্যাটের বিন দির মধ্যে একটি setenv.sh তৈরি করে এই দিরটিকে ক্লাসপাথে যুক্ত করুন।

আপনার টমক্যাটের setenv.sh এ (যদি এই ফাইলটি বিদ্যমান না থাকে তবে একটি তৈরি করুন, টমক্যাট এই setenv.sh ফাইলটি লোড করবে। #!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"

./Webapps//WEB-INF/classes/app.properties- এ আপনার সম্পত্তি ফাইল থাকা উচিত নয়

টমক্যাট বর্গ লোডার ওয়েবে-আইএনএফ / ক্লাস / এর মধ্যে একটির সাথে ওভাররাইড করবে

একটি ভাল পঠন: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.