2014-04-02 10 views
7

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

मेरी समझ में, वेल्ड सक्रिय अनुप्रयोग-व्यापी है और इसमें एक ही एप्लिकेशन-व्यापी दृश्य है। इसलिए इससे कोई फर्क नहीं पड़ता कि मैं सीडीआई का उपयोग करना चाहता हूं - यह काम करता है।

लेकिन कुछ संकेत हैं जो इस धारणा को जन्म देते हैं कि यह सच नहीं है। जैसे

जब कुछ मॉड्यूल जो युद्ध में पैक किया जाता है में BeanManager का उपयोग कर रहा Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-webui-frontend-1.0-SNAPSHOT.war/WEB-INF/lib/test-webui-backend-1.0-SNAPSHOT.jar [bean count=76] मिलती है: BeanManager की toString -method विभिन्न मॉड्यूल में विभिन्न उत्पादन को दर्शाता है।

यदि यह सीधे ईएआर में निहित पुस्तकालय में उपयोग किया जाता है: Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-ejb3-dao-1.0-SNAPSHOT.jar/ [bean count=224]

तो ऐसा लगता है कि ये BeanManagers एप्लिकेशन के विभिन्न हिस्सों के लिए "ज़िम्मेदार" हैं। क्या ये सच है?

उत्तर

4

यह एप्लिकेशन सर्वर द्वारा संभाला जाता है जो ईएआर स्पेक को समझता है।

विकिपीडिया से

:

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

इसलिए प्रत्येक मॉड्यूल का अपना BeanManager होता है जबकि एप्लिकेशन सर्वर इन उदाहरणों के बीच निर्भरता प्रबंधित करता है।

+0

आप सही हैं। ऐसा लगता है कि 'toString' के 'के लिए ...' आउटपुट क्लासलोडर है जो वर्तमान संदर्भ में सक्रिय है। लेकिन क्या इसका मतलब यह है कि एप्लिकेशन सर्वर में कई अलग-अलग "सीडीआई-एप्लिकेशन" (या 'बीनमेनर्स') हैं जो उनके सीडीआई-संदर्भ (जैसे एप्लिकेशन-स्कोप) को पूरी तरह से अलग करते हैं? – MrD

+0

नहीं, एप्लिकेशन में एप्लिकेशन का दायरा मौजूद है, यानी ईएआर आवेदन। लेकिन प्रत्येक मॉड्यूल का अपना बीनमेनगर होता है, जबकि ऐप सर्वर इन उदाहरणों के बीच निर्भरताओं का प्रबंधन कर रहा है। – thobens

+0

तो क्या विभिन्न बीनमेनर्स का कोई व्यावहारिक प्रभाव है? यदि नहीं: 'toString' आउटपुट में मॉड्यूलनाम/क्लासलोडर का उल्लेख करना क्यों फायदेमंद है? – MrD

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