2017-03-26 22 views
7

मैं जावा 9 के साथ प्रयोग कर रहा हूँ और देख निम्न परिदृश्यों पर:जावा 9 में, कुछ मामलों में पैकेज टकराव का थोड़ा अलग व्यवहार क्यों किया जाता है?

प्रयोग 1

  • मॉड्यूल एक
  • मॉड्यूल बी
  • दोनों com.foo नाम के एक गैर खाली पैकेज की घोषणा लेकिन इसे निर्यात न करें।

    java.lang.RuntimeException: मॉड्यूल बी और मॉड्यूल दोनों में पैकेज com.foo

  • दोनों एक 3 मॉड्यूल सी

'सी' से एक मुख्य रनिंग के लिए आवश्यक हैं एक रनटाइम त्रुटि देता है एक

प्रयोग 2

से पहले लेकिन इस बार दोनों निर्यात com.foo के रूप में एक ही

सी से मुख्य क्रियान्वित करने के परिणाम:

java.lang.module.ResolutionException: मॉड्यूल बी और एक निर्यात पैकेज com.foo मॉड्यूल सी

प्रयोग 3

ही 2 के रूप में, लेकिन इस बार मैंने मॉड्यूल सी में पैकेज com.foo घोषित किया।

अब मुझे संकलन त्रुटि मिलती है: त्रुटि: (4, 1) जावा: मॉड्यूल सी ए और बी

संकलन के दौरान पहले दो मामलों को पकड़ा नहीं गया है, तो पैकेज com.foo को पढ़ता है। क्या रनटाइम गुण हैं जो प्रोग्राम को निष्पादित करने से पहले उस पूर्ववर्ती संकल्प से अवगत नहीं हैं?

इसके अलावा, जहां तक ​​त्रुटि संदेश संबंधित हैं: प्रयोग 2 में त्रुटि संदेश में त्रुटि संदेश में किस तरह से त्रुटि संदेश है। ऐसा नहीं है कि यदि मॉड्यूल में से कोई एक इसे निर्यात नहीं करता है तो अंतिम परिणाम कोई अलग होगा। दूसरे शब्दों में, विभिन्न त्रुटि संदेशों के उत्पादन के पीछे क्या विचार था?

+2

* "पहले दो मामले संकलन के दौरान क्यों नहीं पकड़े गए हैं?" * क्योंकि संकलक उस * विस्तारित * विश्लेषण के माध्यम से नहीं गए जो सीधे मॉड्यूल सी द्वारा उपयोग नहीं किए जा रहे हैं। यह क्यों होगा? केवल # 3 संकलक को 'com.foo' पैकेज को देखने का कारण बनता है। अब, अगर आपके # 2 ने 'com.foo' से कक्षा को 'आयात' करने का प्रयास किया था, तो शायद यह संकलन विफल हो जाएगा, क्योंकि संकलक को यह पता लगाना होगा कि कौन से मॉड्यूल से इसे प्राप्त किया जाए। – Andreas

+1

@ एंड्रियास, इसके बारे में पता नहीं - सभी मॉड्यूल में सभी पैकेजों को निर्यात करने के बाद। मैं व्यावहारिक रूप से इसे चांदी की प्लेट पर कंपाइलर को दे रहा हूं :)। यहां तक ​​कि यदि यह एक लंबी श्रृंखला थी - कीवर्ड पर विचार करना - यह एक कम्प्यूटेशनल जटिल समस्या नहीं है। वे पहले से ही पठनीयता ग्राफ बना रहे हैं, इसलिए सब कुछ बाहर है। – Vitaliy

+1

तो, उन्होंने अतिरिक्त (वैकल्पिक) काम नहीं किया। यदि आपको लगता है कि यह "महत्वपूर्ण क्यों है" पूछने के बजाय, यह महत्वपूर्ण है, तो मैं सुझाव दूंगा कि आप एक वृद्धि अनुरोध दर्ज करें। – Andreas

उत्तर

7

प्रयोग # 2 और # 3 विभाजन पैकेज के मुद्दों को विभाजित कर रहे हैं और संकलन-समय और रन-टाइम दोनों में त्रुटियां होनी चाहिए। # 2 के लिए मैं आपकी पोस्ट से नहीं कह सकता हूं कि सी को संकलित करते समय आपको संकलन त्रुटि क्यों नहीं दिखाई दे रही है। आपको "मॉड्यूल सी दोनों पैकेज ए और बी से पैकेज com.foo पढ़ता है" जैसे टेक्स्ट के साथ एक त्रुटि दिखाई देनी चाहिए।

प्रयोग # 1 संभवतः ए, बी, और सी अनुप्रयोग मॉड्यूल पथ पर है जहां वे सभी ओवरलैपिंग पैकेजों के कारण समान नाम स्थान (समान श्रेणी लोडर) में नहीं रह सकते हैं। आपके द्वारा देखे गए त्रुटि संदेश को हाल के निर्माण में थोड़ा सुधार हुआ है।

ध्यान दें कि प्रयोगों पर jigsaw-dev पर कई धागे में चर्चा की गई है और कम से कम जेडीके 9 अभी भी विकास में है, तो प्रश्न और अनुभव लाने के लिए यह बेहतर जगह हो सकती है।

+0

धन्यवाद एलन। अगर मैं सही ढंग से समझता हूं, तो मुझे सभी मामलों में संकलन त्रुटियां मिलनी चाहिए। यदि आवश्यक हो तो मैं मेलिंग सूची पर फिर से जांच और पुनः पोस्ट करूंगा। अब जब मैं इसके बारे में सोचता हूं, मैं प्रयोगों को इंटेलिज के ईए संस्करण का संचालन कर रहा हूं। ऐसा हो सकता है कि वे कुछ भी याद कर रहे हैं। – Vitaliy

+2

प्रयोग # 1 का परिणाम संकलन त्रुटि नहीं होगा, अन्य दो को चाहिए। # 1 रन-टाइम पर काम करेगा जब मॉड्यूल को बाल परत में लोड किया जाता है, बस एप्लिकेशन मॉड्यूल पथ नहीं। –

+1

तो जब आप @AlanBateman से स्वयं को उत्तर देते हैं तो बहुत अच्छा लगता है! – Eugene

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