2012-09-29 16 views
9

जावा प्रोजेक्ट में, सभी .java फ़ाइलों को उसी फ़ोल्डर में रखने का मतलब है कि वे एक ही पैकेज में हैं?जावा में पैकेज और निर्देशिका के बीच अंतर

में सभी परियोजना फ़ाइलों को एक फ़ोल्डर में रखने की तुलना में हमारी परियोजना के लिए पैकेज बनाने में क्या अंतर है?

This thread वास्तव में मेरे प्रश्न का समाधान नहीं करता है।

+4

अपने शीर्षक googling इस लिंक http://stackoverflow.com/questions/9510932/java-package-vs-folder-structure-what-is-the-difference – gigadot

+0

मैं understand.kindly स्पष्ट नहीं है देता है।! – jbmeta

+2

इसका मतलब है कि सवाल पहले से ही पूछा गया है और आपको पहले और इसी तरह के प्रश्नों को देखना चाहिए। –

उत्तर

12

पैकेज और निर्देशिका के बीच एक रिश्ता है, लेकिन यह है जो आप को बनाए रखना चाहिए। यदि आपके पास एक वर्ग है जो "mypackage1.mypackage2" में है, तो इसका मतलब है कि java कमांड को "mypackage1 \ mypackage2" नामक निर्देशिका संरचना में ढूंढने की उम्मीद है ("पीछे की ओर" विंडोज नोटेशन), उस निर्देशिका संरचना के आगे एक निर्देशिका में एम्बेडेड (चलिए इसे "myjava" कहते हैं) जिसका नाम classpath में है (या फिर सीधे "वर्तमान निर्देशिका" में है)।

तो अपने जावा वर्ग (जो आंतरिक रूप से कहते हैं package mypackage1.mypackage2;), में है जैसे कि, "\ Users \ Myname \ Myjava \ mypackage1 \ mypackage2 \", और आप जगह "\ Users \ Myname \ Myjava" वर्ग पथ में, या अन्यथा आपकी वर्तमान निर्देशिका "\ Users \ myName \ myjava" पर सेट है।

यदि आप इसे मिश्रित करते हैं, तो कक्षा पूरी तरह से नहीं मिलेगी, या आपको कभी भी घबराहट "NoClassDefFoundError" जैसी कोई त्रुटि मिल जाएगी।

क्यों पैकेज (और निर्देशिका) का उपयोग करेगा, कारण "नाम स्थान" और "चिंताओं को अलग करना" (उनको देखें) के साथ करना है। यदि कोई पैकेज नहीं था और सभी "जावा.लांग", "जावा.ओ", "सन.मिस्क", एट अल क्लासेस एक साथ थे, तो जावा सीधे रखना मुश्किल होगा। सबसे पहले, उन्हें सीधे रखने और नाम विवादों से परहेज करने के लिए नाम "उपसर्ग" का उपयोग करना होगा। और लॉजिकल ग्रुपिंग में से अधिकांश खो जाएंगे।

अपनी खुद की परियोजनाओं के साथ आपको अपने लिए लिखने वाले सरल छोटे कार्यक्रमों के लिए पैकेजों का उपयोग करने की आवश्यकता नहीं है, लेकिन यदि आप कुछ लिखते हैं तो आप किसी और को दे सकते हैं, यह "myname.myproject" जैसे पैकेज का उपयोग करने के लिए विनम्र है (अपना नाम और पाठ्यक्रम की प्रोजेक्ट को प्रतिस्थापित करना), इसलिए जिस व्यक्ति को आप इसे देते हैं उसे नाम विवादों के बिना दूसरों के साथ जोड़ सकते हैं।

बड़े अनुप्रयोगों में आप अलग-अलग स्तरों का उपयोग करके पाएंगे, आप कार्यों को सीधे रखने में मदद करते हैं, ताकि आप जान सकें कि सबकुछ कहां है। यह आपको विभिन्न कार्यात्मक क्षेत्रों के बीच "सीमा पार करने" से भी हतोत्साहित करता है, इसलिए आपको असंबंधित तर्क मनोरंजन नहीं मिलता है।

ग्रहण (यदि आप इसका उपयोग करते हैं) इस तरह की समस्या को थोड़ा सा हल करता है क्योंकि यह निर्देशिका और पैकेज नाम प्रदान करने के लिए "चाहता है" और कभी-कभी (लेकिन हमेशा नहीं) उन्हें सिंक में रखेगा।

+0

तो कहते हैं कि मैं फ़ोल्डर \ जावा \ लीम्बो \ जो अन्य फ़ाइल से एक वर्ग (another.java फ़ाइल) जो एक ही \ जावा \ लीम्बो \ जगह में भी है उपयोग करने के लिए की आवश्यकता है में एक जावा फाइल है, की शुरुआत में की सुविधा देता है दोनों फ़ाइलों मैं _package लीम्बो है; _ लिखा लेकिन जब मैं संकलन मैं मुट्ठी फ़ाइल जो एक ही फ़ोल्डर में द्वितीय श्रेणी, कैसे है कि आवश्यकता के लिए एक ClassNotFound त्रुटि मिल सकता है? – jbmeta

+0

@jtnks - जब संकलन आप बस के रूप में जब 'java' आदेश चलाकर एक वैध वर्ग पथ के साथ स्थापित किया जाना चाहिए। अपने परिदृश्य के लिए, 'cd \ java' और फिर' javac limbo \ MyClass.java' चलाएं। यह दोनों वर्गों को उनके उचित नामों में उनके पैकेज नामों और निर्देशिका संरचना के संबंध में रखता है। –

+0

बहुत बहुत धन्यवाद @ हॉटिक्स .. यह सब ठीक काम कर रहा है और अब यह सब अच्छी तरह से पैक किया गया है। !! – jbmeta

6
  • संकुल प्रदान अपनी कक्षाओं को तार्किक नाम स्थान ..

  • और इन संकुल निर्देशिका स्तरों के रूप (वे नेस्ट निर्देशिका करने के लिए परिवर्तित कर रहे हैं) शारीरिक प्रदान करने के लिए जमा हो जाती है आपकी कक्षाओं में समूह (नामस्थान) ..

इसके अलावा, ध्यान दें कि physical नाम स्थान logical नाम स्थान के अनुसार हो गया है .. आप package com.demo साथ अपनी कक्षा, निर्देशिका संरचना के तहत हो सकता है नहीं: - \com\demo\temp\, यह हो गया है \com\demo\ के तहत, और इस निर्देशिका classpath ताकि अपनी कक्षाओं JVM को दिखाई है जब वह अपने कोड चलाता है में जोड़ा जाता है ..

आप हा मान लीजिए निम्नलिखित निर्देशिका संरचना निम्नलिखित है: -


|
+ - नमूना.जावा (डेमोपैकेज बी के तहत कक्षा
|
+ - Outer.java (डेमो कक्षा - कोई पैकेज नहीं)
|
+ - बी
|       |
|     + - डेमो.क्लास
|
+ - सी
|       |
|     + - Abc.class
|
+ - Demo.class

मान लीजिए, अपनी कक्षा Abc.class और Demo.class (निर्देशिका ए के तहत), किसी भी पैकेज के तहत परिभाषित नहीं है, जबकि अपनी कक्षा Demo.class (निर्देशिका बी के तहत) package B के तहत परिभाषित किया गया है । \A (दो कक्षाओं के लिए: - -: Demo.class और B.Demo.class) और \A\C (कक्षा Abc.class के लिए) .. अलग पैकेज के तहत

  • कक्षाएं एक ही नाम का उपयोग कर सकते तो, आप अपने classpath में दो निर्देशिका की आवश्यकता है। यही कारण है कि ऊपर परिभाषित दो Demo.class के बीच कोई संघर्ष नहीं होगा .. क्योंकि वे अलग-अलग packages में हैं। यही कारण है कि उन्हें namespaces में विभाजित के पूरे मुद्दे है .. यह फायदेमंद है, क्योंकि आप अपने वर्गों के लिए अद्वितीय नामों से बाहर नहीं चलेंगे ..
4

वर्ग लोडर सबसिस्टम है आपकी क्वेरी का जवाब देंगे समझना।

संदर्भ के साथ

Inside JVM by Bill Venners

करने के लिए एक पूरी तरह से योग्य प्रकार नाम को देखते हुए, मौलिक वर्ग लोडर में किसी तरह का प्रयास प्रकार के सरल नाम के साथ साथ ".class" के साथ एक फ़ाइल का पता लगा होना चाहिए। इसलिए, JVM में संग्रहीत उपयोगकर्ता-परिभाषित निर्देशिका पथ को क्लासस्पैट नामक एक पर्यावरण चर की खोज करता है। प्राइमोरियल लोडर प्रत्येक निर्देशिका में दिखता है, ताकि निर्देशिका क्लासस्पैट में दिखाई दे, जब तक कि उचित नाम वाली फ़ाइल न मिल जाए: प्रकार सरल नाम प्लस ".class"।जब तक प्रकार अनाम पैकेज का हिस्सा है, मौलिक लोडर उम्मीद फ़ाइल CLASSPATH में एक निर्देशिका के उपनिर्देशिका में किया जाना है। का पथ नाम उपनिर्देशिका प्रकार के पैकेज नाम से बनाया गया है। उदाहरण के लिए, यदि मौलिक वर्ग लोडर वर्ग java.lang.Object लिए खोज रहा है, यह Object.class के लिए जावा \ प्रत्येक CLASSPATH निर्देशिका के लैंग उपनिर्देशिका में दिखेगा।

+0

वास्तविक चश्मा के संदर्भ के लिए उप-वोट। – Chad

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