2013-05-03 9 views
12

जब कोई एप्लिकेशन सर्वर के रूप में टोमकैट का उपयोग कर जावा वेब एप्लिकेशन सेट अप करता है तो अक्सर पुस्तकालय उपलब्ध होने पर मुझे भ्रमित हो जाता है। स्टैक ओवरफ़्लो पर कुछ चर्चाओं के माध्यम से, मैंने सीखा है कि कुछ पुस्तकालय (.jar) फ़ाइलें रनटाइम पर उपलब्ध हैं, जबकि अन्य संकलन समय पर उपलब्ध हैं। प्रायः मुझे त्रुटियां मिलेंगी और उन्हें परीक्षण और त्रुटि से हल कर देगा, जब तक कि एप्लिकेशन रन या संकलित नहीं हो जाता तब तक विभिन्न निर्देशिकाओं में जार फ़ाइलों को रखेगा। हाल ही में मुझे बताया गया था कि आप वेब-आईएनएफ/lib फ़ोल्डर के माध्यम से रनटाइम पर उपलब्ध .jar लाइब्रेरी बना सकते हैं। मैंने इसके बारे में सोचना शुरू कर दिया और कुछ सवाल उठाए। मैंने अतीत में इस विषय पर पढ़ा है और मुझे ऐसा स्रोत नहीं मिला है जो जानकारी को उस संदर्भ में रखता है जिसे मैं आसानी से समझता और रखता हूं।जावा लाइब्रेरी रनटाइम बनाम संकलन समय

  1. क्या कोई संकलन समय क्लासपाथ और एक रनटाइम क्लासपाथ है जिसे आप किसी प्रोजेक्ट के लिए सेट कर सकते हैं?

    ए। क्या रनपाइम पर उपलब्ध पुस्तकालयों पर चर्चा के लिए क्लासपाथ भी एक लागू शब्द है?

  2. क्या वेब-आईएनएफ/lib रनटाइम पर लाइब्रेरी उपलब्ध कराने का एकमात्र तरीका है? टोमकैट में lib फ़ोल्डर के बारे में क्या यह रनटाइम पर उपलब्ध है?

  3. यह क्लासलोडर्स से कैसे संबंधित है? मुझे पता है कि क्लासलोडर का पदानुक्रम बनाया गया है। क्या ये सख्ती से रनटाइम परिचालनों के लिए हैं?

+0

"क्या कोई संकलन समय क्लासपाथ और एक रनटाइम क्लासपाथ है जिसे आप किसी प्रोजेक्ट के लिए सेट कर सकते हैं?" मुझे नहीं लगता कि एक "परियोजना" एक टोमकैट अवधारणा है। क्या आप वेबपैप या एक्लिप्स (या अन्य आईडीई) प्रोजेक्ट के बारे में सोच रहे हैं? – leonbloy

+0

मुझे इसे बेहतर ढंग से स्कॉप्ड करना चाहिए था, मैं ग्रहण और टॉमकैट को खाते में ले रहा हूं। –

उत्तर

15

संकलन classpath द्वारा उपलब्ध पुस्तकालयों classpath (javac -cp ..., या अपने आईडीई का उपयोग कर) अपने जावा स्रोत फ़ाइलें संकलन करने के लिए इस्तेमाल होता है। स्रोत फ़ाइल में संदर्भित प्रत्येक वर्ग संकलन वर्गपथ में मौजूद होना चाहिए, अन्यथा संकलक शिकायत करेगा कि वह कक्षा नहीं ढूंढ सकता है।

एक बार जब आप कक्षाओं को संकलित कर लेते हैं, तो आप उनका उपयोग करके एक प्रोग्राम चला सकते हैं (java -cp ... का उपयोग कर)। जाहिर है, पुस्तकालय जिन पर आपका स्रोत कोड सीधे निर्भर करता है रनटाइम क्लासपाथ में होना चाहिए। लेकिन वह सब नहीं है। यदि आप सीधे CoolLibrary.jar पर निर्भर करते हैं, और यह लाइब्रेरी आंतरिक रूप से Guava.jar पर निर्भर करती है, तो Guava.jar रनटाइम क्लासपाथ में भी होना चाहिए, हालांकि संकलन करते समय इसकी आवश्यकता नहीं थी।

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

वेबपैप के मामले में रनटाइम क्लासपाथ की बात करना, सरलीकरण का एक सा है। हकीकत में, प्रत्येक वेबैप के वर्गों को टोमकैट द्वारा विशिष्ट क्लासलोडर द्वारा गतिशील रूप से लोड किया जाता है। और यह वेबपैप क्लासलोडर टोमकैट के क्लासलोडर का बच्चा है। तो, सिद्धांत रूप में, आप वेबमैप जार को सीधे टोमकैट के क्लासपाथ में रख सकते हैं, लेकिन इसका मतलब यह होगा कि सभी वेबपैप्स इन पुस्तकालयों को साझा करेंगे, और आपको वेबपैप्स को अनावश्यक और पुन: नियोजित करने में समस्या होगी।प्रति वेबपैड के लिए एक विशिष्ट क्लासलोडर रखने का लक्ष्य, एक ही जेवीएम में, एक ऐप गुवा 11.0 पर निर्भर है, और दूसरा एक उदाहरण के लिए गुवा 12.0 पर निर्भर है।

टोमकैट क्लासलोडर के बारे में अधिक जानकारी के लिए, the documentation पढ़ें।

+0

तो जब मैं अपने टॉमकैट सर्वर को एक्लिप्स में खोलता हूं और अपना क्लासपाथ सेट करता हूं जो रनटाइम क्लासपाथ है? क्या प्रति आवेदन सेट करने के लिए वैसे भी है? मैं समझता हूं कि मैं इन जारों को एप्लिकेशन के लिए एक रनटाइम क्लासपाथ में निर्दिष्ट करके 100 एमबी युद्ध फ़ाइल से बचाना चाहता हूं। –

+2

तैनात वेबपैम क्या मायने रखता है। डिफ़ॉल्ट रूप से, ग्रहण WTP प्रोजेक्ट में वेबकंटेंट/WEB-INF/lib के अंतर्गत सभी जार स्वचालित रूप से संकलन क्लासपाथ (ग्रहण को कौन सा ग्रह बनाता है) पर ग्रहण द्वारा जोड़ा जाता है, और वेबपैप के साथ भी WEB-INF/ग्रहण नियोक्ता द्वारा lib, lib। तो, एक विशिष्ट ग्रहण वेब प्रोजेक्ट में, आप WEB-INF/lib में वेबपैप द्वारा आवश्यक सभी पुस्तकालयों को रखेंगे, और सभी लाइब्रेरी को रनटाइम पर आवश्यक नहीं है (उदाहरण के लिए, यूनिट टेस्ट लाइब्रेरीज़), किसी अन्य निर्देशिका में, रास्ता बनाना आमतौर पर टॉमकैट के आंतरिक कक्षा के साथ गड़बड़ करने का कोई कारण नहीं है। –

1
  1. ग्रहण में

    , आप java build path जो संकलन समय के दौरान पुस्तकालयों में शामिल है, और आप order and export है, जो क्रम के लिए है।

  2. केवल बिल्ला डिफ़ॉल्ट

+1

ग्रहण में 'आदेश और निर्यात' टैब पर यह कहता है कि 'निर्यातित प्रविष्टियों को निर्भर परियोजनाओं में योगदान दिया जाता है' इसका मतलब यह नहीं होगा कि निर्भर परियोजनाएं उन पुस्तकालयों को संकलन के लिए प्राप्त करती हैं? क्या आप वाकई सर्वर के रनटाइम से संबंधित हैं? –

संबंधित मुद्दे