2017-09-17 31 views
5

मैं यह समझने की कोशिश कर रहा हूं कि जेपीएमएस कैसे काम करता है।जावा 9 में कितने अज्ञात मॉड्यूल बनाए गए हैं?

here

classpath से पूरी तरह से अभी तक समाप्त नहीं हुई है। सभी जेएआर (मॉड्यूलर या नहीं) और कक्षापथ पर कक्षाओं को मॉड्यूल में निहित किया जाएगा। स्वचालित मॉड्यूल के समान, यह सभी संकुल निर्यात करता है और सभी अन्य मॉड्यूल पढ़ता है। लेकिन जाहिर है, इसका नाम नहीं है। उस कारण के लिए, इसे आवश्यक एप्लिकेशन मॉड्यूल द्वारा आवश्यक और पढ़ा नहीं जा सकता है। बदले में अज्ञात मॉड्यूल सभी अन्य मॉड्यूल तक पहुंच सकता है।

कृपया, ...on the classpath will be contained in the Unnamed Module पर ध्यान दें। मॉड्यूल एकवचन है।

here

संगतता के लिए से, classpath पर सभी कोड कोई छिपी संकुल और पूरे JDK के लिए पूरा उपयोग के साथ एक विशेष अनाम मॉड्यूल के रूप में पैक किया जाता है।

फिर unnamed module। मॉड्यूल एकवचन है।

क्या मैं सही समझता हूं कि हमेशा जेपीएमएस में केवल एक अज्ञात मॉड्यूल होता है? क्या इसका मतलब यह है कि जावा 9 से पहले विकसित किए गए एप्लिकेशन और जावा 9 के लिए अपडेट नहीं किए गए एक यूनिट मॉड्यूल के रूप में लोड किए जाएंगे?

उत्तर

5

मैं समझता हूँ कि हमेशा JPMS में केवल एक अनाम मॉड्यूल है सही है कि वहाँ है?

कम

में सामान्य शब्दों में, नहीं। लेकिन आइए इसे इस तरह से रखें: यदि आप क्लास पथ पर कुछ या यहां तक ​​कि सभी जेएआर डालते हैं और आपका एप्लिकेशन किसी भी अतिरिक्त सामग्री को लोड करने के लिए क्लास लोडर नहीं बनाता है, तो केवल एक अज्ञात मॉड्यूल है जिसकी आपको देखभाल करने की आवश्यकता है।

अधिक विस्तार

हर ClassLoader में its own unnamed module यह वर्गों है कि यह वर्ग पथ से लोड प्रतिनिधित्व करने के लिए उपयोग करता है है। यह आवश्यक है क्योंकि मॉड्यूल सिस्टम को सब कुछ मॉड्यूल में होना आवश्यक है।

nullpointer's answer विस्तार से बताता है, एक आवेदन डिफ़ॉल्ट रूप से तीन अलग-अलग वर्ग लोडर का उपयोग करेगा। यह संभव है कि यह अपने स्वयं के वर्ग लोडर को स्पिन कर सके, उदाहरण के लिए प्लगइन लोड करने के लिए। यदि ऐसा नहीं होता है, हालांकि, सभी एप्लिकेशन कोड सिस्टम/एप्लिकेशन क्लास लोडर में समाप्त हो जाएंगे और इसलिए एक ही अनामित मॉड्यूल में। यही कारण है कि आमतौर पर केवल एक ही आपको देखभाल करने की आवश्यकता होती है।

क्या इसका मतलब यह है कि जावा 9 के पहले विकसित किए गए एप्लिकेशन और जावा 9 के लिए अपडेट नहीं किए गए एप्लिकेशन को एक अज्ञात मॉड्यूल के रूप में लोड किया जाएगा?

यह है कि क्या कोड (आवेदन, चौखटे, पुस्तकालयों) के साथ कोई संबंध नहीं है लक्षित करता जावा 9 - यह केवल जो रास्ता आप एक जार जगह, वर्ग पथ या module path पर पर निर्भर करता है।

यदि यह कक्षा पथ पर है, तो यह अज्ञात मॉड्यूल में दूसरे वर्ग पथ सामग्री के साथ समाप्त होता है। मॉड्यूल डिस्क्रिप्टर के बिना सादे जार के लिए यह सच है लेकिन मॉड्यूलर जेएआर के लिए भी एक है।

यदि यह मॉड्यूल पथ पर है, तो यह अपना स्वयं का मॉड्यूल प्राप्त करता है। यदि यह एक मॉड्यूलर जेएआर है, तो यह those described throughout the State of the Module System के रूप में एक स्पष्ट मॉड्यूल प्राप्त करता है - सादा जेएआर automatic modules में बदल जाते हैं (बहुवचन नोट करें: प्रति जार एक स्वचालित मॉड्यूल)।

4

क्या मैं सही समझता हूं कि हमेशा जेपीएमएस में केवल एक अज्ञात मॉड्यूल होता है?

हां, एक अज्ञात मॉड्यूल है। अज्ञात मॉड्यूल unnamed package की मौजूदा अवधारणा के समान है।

कि संकुल के भंडारण के लिए पदानुक्रमित संचिका तंत्र का उपयोग जावा SE मंच के कार्यान्वयन में, एक ठेठ रणनीति प्रत्येक निर्देशिका के साथ एक अनाम पैकेज संबद्ध करने के लिए है, केवल एक अज्ञात पैकेज एक समय में देखा जा सकता है, अर्थात् वह "वर्तमान कार्यशील निर्देशिका" से जुड़ा हुआ है। "वर्तमान कार्यशील निर्देशिका" का सटीक अर्थ मेजबान सिस्टम पर निर्भर करता है।


यह मतलब यह है कि अनुप्रयोग जो और Java9 से पहले विकसित किए गए Java9 के लिए अद्यतन नहीं एक अनाम मॉड्यूल के रूप में लोड किया जाएगा?

हां, क्लासपाथ पर रखे गए उन जारों के लिए एक अज्ञात मॉड्यूल के रूप में माना जाएगा। bottom up migration अनाम मॉड्यूल की अवधारणा के साथ के रूप में एक ऐसी ही उदाहरण के साथ इस दिखाता है:

मान लीजिए, जैसे, कि ऊपर दिखाए गए आवेदन मूल रूप से जावा SE 8 के लिए बनाया गया था, इसी तरह के नाम जार फ़ाइलों का एक सेट के रूप में कक्षा पथ पर रखा गया। यदि हम इसे जावा एसई 9 पर चलाते हैं तो जेएआर फाइलों के प्रकार अज्ञात मॉड्यूल में परिभाषित किए जाएंगे।


वास्तविक सवाल है कि यहाँ पैदा कर सकते कौन सा वर्ग लोडर अनाम मॉड्यूल जुड़ा हुआ है? The State of Module System about unnamed module इसके बारे में एक स्पष्टीकरण बताता है।

हर वर्ग लोडर, यह पता चला है, अपनी अनूठी अनाम मॉड्यूल है, जो नए ClassLoader::getUnnamedModule विधि द्वारा दिया जाता है। एक वर्ग लोडर एक प्रकार है कि एक नामित मॉड्यूल तो कि प्रकार है कि लोडर के अनाम मॉड्यूल, यानी में माना जाता है में निर्धारित नहीं है लोड करता है, तो इस किस्म की Class वस्तु की getModule विधि वापस आ जाएगी इसका लोडर का अनाम नाम मॉड्यूल। मॉड्यूल बोलचाल की भाषा में " अनाम मॉड्यूल" कहा जाता है तो, है, बस आवेदन वर्ग लोडर, जो classpath से प्रकार लोड करता है जब वे संकुल किसी भी ज्ञात मॉड्यूल द्वारा परिभाषित नहीं कर रहे हैं की अनाम मॉड्यूल।

ClassLoader में संशोधित रूप में जावा -9 कहा गया है कि:

  • Bootstrap class loader:

    जावा रन-टाइम निम्नलिखित में निर्मित कक्षा लोडर है: वर्चुअल मशीन के अंतर्निर्मित वर्ग लोडर ...

  • Platform class loader: ... मंच वर्ग लोडर को परिभाषित मॉड्यूल के उन्नयन/अधिभावी के लिए अनुमति देने के लिए, और जहां के लिए उन्नत मॉड्यूल वर्ग के लिए परिभाषित मॉड्यूल पढ़ लोडर मंच वर्ग लोडर के अलावा अन्य और अपने पूर्वजों, तो प्लेटफ़ॉर्म क्लास लोडर को अन्य क्लास लोडर्स, उदाहरण के लिए एप्लिकेशन क्लास लोडर को प्रतिनिधि करना पड़ सकता है। दूसरे शब्दों में, में कक्षाएं प्लेटफार्म वर्ग लोडर के अलावा कक्षा लोडर को परिभाषित मॉड्यूल नामित करती हैं और इसके पूर्वजों प्लेटफ़ॉर्म क्लास लोडर पर दिखाई दे सकते हैं।

  • System class loader: यह भी आवेदन वर्ग लोडर रूप में जाना जाता है और मंच वर्ग लोडर से अलग है। सिस्टम क्लास लोडर आमतौर पर पर कक्षा पथ, मॉड्यूल पथ, और जेडीके-विशिष्ट उपकरण पर कक्षाओं को परिभाषित करने के लिए उपयोग किया जाता है। प्लेटफार्म वर्ग लोडर सिस्टम क्लास लोडर का अभिभावक या पूर्वज है जो सभी प्लेटफ़ॉर्म कक्षाएं इसके लिए दृश्यमान हैं।

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