Java Language
द क्लासपथ
खोज…
परिचय
टिप्पणियों
जावा वर्ग लोड हो रहा है
जेवीएम (जावा वर्चुअल मशीन) कक्षाओं को तब और जब जरूरत होगी कक्षाओं को लोड करेगा (इसे आलसी-लोडिंग कहा जाता है)। उपयोग किए जाने वाले वर्गों के स्थान तीन स्थानों पर निर्दिष्ट किए गए हैं: -
- जावा प्लेटफ़ॉर्म द्वारा अपेक्षित लोगों को पहले लोड किया जाता है, जैसे कि जावा क्लास लाइब्रेरी में और यह निर्भरताएं हैं।
- एक्सटेंशन क्लासेस को लोड किया जाता है (यानी
jre/lib/ext/
) में - तब क्लासपाथ के माध्यम से उपयोगकर्ता-परिभाषित कक्षाएं भरी हुई हैं
कक्षाएं उन कक्षाओं का उपयोग करके भरी जाती हैं जो java.lang.ClassLoader
उपप्रकार java.lang.ClassLoader
। यह इस विषय में और अधिक विस्तार से वर्णित है: क्लास लोडर ।
क्लासपाथ
Classpath JVM या संकलक द्वारा उपयोग किया जाने वाला एक पैरामीटर है जो उपयोगकर्ता द्वारा परिभाषित कक्षाओं और पैकेजों के स्थानों को निर्दिष्ट करता है। इसे कमांड लाइन में इन उदाहरणों के साथ या एक पर्यावरण चर ( CLASSPATH
) के माध्यम से सेट किया जा सकता है
क्लासपाथ को निर्दिष्ट करने के विभिन्न तरीके
क्लासपाथ को सेट करने के तीन तरीके हैं।
इसे
CLASSPATH
पर्यावरण चर का उपयोग करके सेट किया जा सकता है:set CLASSPATH=... # Windows and csh export CLASSPATH=... # Unix ksh/bash
इसे निम्नानुसार कमांड लाइन पर सेट किया जा सकता है
java -classpath ... javac -classpath ...
ध्यान दें कि
-classpath
(या-cp
) विकल्प पर पूर्वता लेता हैCLASSPATH
वातावरण चर।एक निष्पादन योग्य JAR फ़ाइल के लिए classpath को
MANIFEST.MF
मेंClass-Path
तत्व का उपयोग करके निर्दिष्ट किया गया है:Class-Path: jar1-name jar2-name directory-name/jar3-name
ध्यान दें कि यह केवल तब लागू होता है जब JAR फ़ाइल इस तरह निष्पादित होती है:
java -jar some.jar ...
निष्पादन के इस मोड में,
-classpath
विकल्प और CLASSPATH पर्यावरण चर को अनदेखा किया जाएगा, भले ही JAR फ़ाइल में कोईClass-Path
तत्व न हो।
यदि कोई क्लासपाथ निर्दिष्ट नहीं किया गया है, तो डिफ़ॉल्ट क्लासपाथ java -jar
, या वर्तमान निर्देशिका का उपयोग करते समय चयनित JAR फ़ाइल है।
सम्बंधित:
- https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
- http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
एक निर्देशिका में सभी JAR को क्लासपाथ में जोड़ना
यदि आप सभी JAR को डायरेक्टरी में classpath में जोड़ना चाहते हैं, तो आप classpath वाइल्डकार्ड सिंटैक्स का उपयोग करके इसे संक्षिप्त रूप से कर सकते हैं; उदाहरण के लिए:
someFolder/*
यह JVM को someFolder
फ़ोल्डर में कुछ someFolder
निर्देशिका में JAR और ZIP फ़ाइलों को जोड़ने के लिए कहता है। इस वाक्यविन्यास का उपयोग एक -cp
तर्क, एक CLASSPATH
पर्यावरण चर, या एक निष्पादन योग्य JAR फ़ाइल की मैनिफ़ेस्ट फ़ाइल में Class-Path
विशेषता के रूप में किया जा सकता है । क्लास पथ: क्लास पाथ वाइल्ड कार्ड्स को उदाहरणों और कैविटीज़ के लिए सेट करना ।
टिप्पणियाँ:
- क्लासपैथ वाइल्डकार्ड पहली बार जावा 6 में पेश किए गए थे। जावा के पहले के संस्करण वाइल्डकार्ड के रूप में "*" नहीं मानते हैं।
- आप " " से पहले या बाद में अन्य वर्ण नहीं रख सकते हैं ; उदाहरण के लिए "someFolder / .jar" वाइल्डकार्ड नहीं है।
- एक वाइल्डकार्ड केवल प्रत्यय ".jar" या ".JAR" के साथ फाइलों से मेल खाता है। ज़िप फ़ाइलों को नजरअंदाज कर दिया जाता है, क्योंकि JAR फाइलें एक अलग प्रत्यय के साथ होती हैं।
- एक वाइल्डकार्ड निर्देशिका में केवल JAR फ़ाइलों से मेल खाता है, इसके उपनिर्देशिकाओं में नहीं।
- जब JAR फ़ाइलों के समूह को वाइल्डकार्ड प्रविष्टि से मिलान किया जाता है, तो क्लासपाथ पर उनका सापेक्ष क्रम निर्दिष्ट नहीं होता है।
क्लासपाथ पथ सिंटैक्स
क्लासपैथ प्रविष्टियों का एक अनुक्रम है जो निर्देशिका पथनाम, JAR या ज़िप फ़ाइल पथनाम, या JAR / ज़िप फ़ाइल विनिर्देशन हैं।
कमांड लाइन (जैसे
-classpath
) या पर्यावरण चर के रूप में निर्दिष्ट एक-classpath
, प्रविष्टियों को अलग किया जाना चाहिए;
(अर्धविराम) विंडोज़ पर वर्ण, या:
(बृहदान्त्र) अन्य प्लेटफार्मों पर वर्ण (लिनक्स, यूनिक्स, मैकओएसएक्स और इसी तरह)।किसी JAR फ़ाइल के
MANIFEST.MF
मेंClass-Path
तत्व के लिए, प्रविष्टियों को अलग करने के लिए एकल स्थान का उपयोग करें।
कभी-कभी क्लासपैथ प्रविष्टि में एक स्थान को एम्बेड करना आवश्यक होता है
जब क्लासपाथ को कमांड लाइन पर निर्दिष्ट किया जाता है, तो यह उपयुक्त शेल उद्धरण का उपयोग करने का मामला है। उदाहरण के लिए:
export CLASSPATH="/home/user/My JAR Files/foo.jar:second.jar"
(विवरण आपके द्वारा उपयोग किए जाने वाले कमांड शेल पर निर्भर हो सकता है।)
जब क्लासपथ को JAR फ़ाइल की "MANIFEST.MF" फ़ाइल में निर्दिष्ट किया जाता है, तो URL एन्कोडिंग का उपयोग किया जाना चाहिए।
Class-Path: /home/user/My%20JAR%20Files/foo.jar second.jar
गतिशील कक्षापथ
कभी-कभी, एक फ़ोल्डर से सभी JAR को जोड़ने के लिए पर्याप्त नहीं है, उदाहरण के लिए जब आपके पास मूल कोड होता है और JAR का सबसेट चुनना होता है। इस मामले में, आपको दो main()
विधियों की आवश्यकता है। पहला एक क्लास लोडर बनाता है और फिर दूसरा main()
कॉल करने के लिए इस क्लास लोडर का उपयोग करता है।
यहां एक उदाहरण दिया गया है जो आपके प्लेटफ़ॉर्म के लिए सही SWT देशी JAR का चयन करता है, आपके सभी एप्लिकेशन के JAR जोड़ता है और फिर वास्तविक main()
विधि को लागू करता है: क्रॉस प्लेटफ़ॉर्म जावा SWT एप्लिकेशन बनाएं
वर्गपथ से एक संसाधन लोड करें
यह एक संसाधन (छवि, पाठ फ़ाइल, गुण, KeyStore, ...) को लोड करने के लिए उपयोगी हो सकता है जो एक जार के अंदर पैक किया गया है। इस उद्देश्य के लिए, हम Class
और ClassLoader
उपयोग कर सकते हैं।
मान लें कि हमारे पास निम्नलिखित परियोजना संरचना है:
program.jar
|
\-com
\-project
|
|-file.txt
\-Test.class
और हम file.txt
की सामग्री को Test
क्लास से एक्सेस करना चाहते हैं। हम क्लास लोडर से पूछकर ऐसा कर सकते हैं:
InputStream is = Test.class.getClassLoader().getResourceAsStream("com/project/file.txt");
क्लास लोडर का उपयोग करके, हमें अपने संसाधन (प्रत्येक पैकेज) के पूरी तरह से योग्य पथ को निर्दिष्ट करने की आवश्यकता है।
या वैकल्पिक रूप से, हम टेस्ट क्लास ऑब्जेक्ट को सीधे पूछ सकते हैं
InputStream is = Test.class.getResourceAsStream("file.txt");
वर्ग वस्तु का उपयोग करते हुए, पथ स्वयं कक्षा के सापेक्ष है। हमारा Test.class
com.project
पैकेज में है, जो file.txt
के समान है, हमें किसी भी पथ को निर्दिष्ट करने की आवश्यकता नहीं है।
हालाँकि, हम क्लास ऑब्जेक्ट से निरपेक्ष पथ का उपयोग कर सकते हैं, जैसे:
is = Test.class.getResourceAsStream("/com/project/file.txt");
मार्गनिर्देशों के लिए मानचित्रण का नामकरण
मानक जावा टूलचैन (और उनके साथ हस्तक्षेप करने के लिए डिज़ाइन किए गए तीसरे-पक्ष के उपकरण) में कक्षाओं के नामों को मैप करने के लिए फ़ाइलों और अन्य संसाधनों के मार्गनामों के लिए विशिष्ट नियम हैं जो उनका प्रतिनिधित्व करते हैं।
मैपिंग इस प्रकार हैं
- डिफ़ॉल्ट पैकेज में कक्षाओं के लिए, पथनाम सरल फ़ाइल नाम हैं।
- एक नामित पैकेज में कक्षाओं के लिए, पैकेज नाम घटक निर्देशिका में मैप करता है।
- नामित नेस्टेड और आंतरिक वर्गों के लिए, फ़ाइल नाम एक
$
चरित्र के साथ वर्ग के नामों को मिलाकर बनता है। - अनाम आंतरिक वर्गों के लिए, नामों के स्थान पर संख्याओं का उपयोग किया जाता है।
यह निम्नलिखित तालिका में चित्रित किया गया है:
कक्षा का नाम | स्रोत pathname | क्लासफाइल पाथनाम |
---|---|---|
SomeClass | SomeClass.java | SomeClass.class |
com.example.SomeClass | com/example/SomeClass.java | com/example/SomeClass.class |
SomeClass.Inner | ( SomeClass.java ) | SomeClass$Inner.class |
SomeClass anon आंतरिक कक्षाएं | ( SomeClass.java ) | SomeClass$1.class , SomeClass$2.class , आदि |
क्लासपैथ का क्या अर्थ है: खोज कैसे काम करती है
क्लासपाथ का उद्देश्य एक जेवीएम को बताना है जहां कक्षाओं और अन्य संसाधनों को खोजना है। क्लासपाथ का अर्थ और खोज प्रक्रिया आपस में जुड़ी हुई है।
क्लासपाथ खोज पथ का एक रूप है जो संसाधनों की तलाश के लिए स्थानों का एक क्रम निर्दिष्ट करता है। एक मानक वर्गपथ में, ये स्थान या तो होस्ट फ़ाइल सिस्टम में एक निर्देशिका, एक JAR फ़ाइल या एक ज़िप फ़ाइल है। प्रत्येक मामलों में, स्थान एक नामस्थान की जड़ है जिसे खोजा जाएगा।
क्लासपाथ पर एक वर्ग के लिए खोज करने के लिए मानक प्रक्रिया निम्नानुसार है:
वर्ग के नाम को किसी रिश्तेदार क्लासफाइल पथनाम
RP
मैप करें। वर्ग के नाम के लिए वर्ग फाइलिंग के लिए मानचित्रण कहीं और वर्णित है।प्रत्येक प्रवेश के लिए वर्गपथ में
E
:- यदि प्रविष्टि एक फ़ाइल सिस्टम निर्देशिका है:
- निरपेक्ष मार्गनाम
AP
देने के लिएE
सापेक्षRP
हल करें। - टेस्ट अगर
AP
एक मौजूदा फ़ाइल के लिए एक रास्ता है। - यदि हाँ, तो उस फ़ाइल से कक्षा लोड करें
- निरपेक्ष मार्गनाम
- यदि प्रविष्टि JAR या ZIP फ़ाइल है:
- JAR / ZIP फ़ाइल इंडेक्स में लुकअप
RP
। - यदि संबंधित JAR / ZIP फ़ाइल प्रविष्टि मौजूद है, तो उस प्रविष्टि से कक्षा लोड करें।
- JAR / ZIP फ़ाइल इंडेक्स में लुकअप
- यदि प्रविष्टि एक फ़ाइल सिस्टम निर्देशिका है:
क्लासपथ पर संसाधन की खोज करने की प्रक्रिया इस बात पर निर्भर करती है कि संसाधन पथ निरपेक्ष है या सापेक्ष। एक निरपेक्ष संसाधन पथ के लिए, प्रक्रिया उपरोक्त है। Class.getResource
या Class.getResourceAsStream
का उपयोग करके हल किए गए एक रिश्तेदार संसाधन पथ के लिए, खोज से पहले वर्ग पैकेज के लिए पथ पूर्व निर्धारित है।
(ध्यान दें कि ये मानक जावा क्लास लोडर द्वारा कार्यान्वित प्रक्रियाएं हैं। एक कस्टम क्लास लोडर खोज को अलग तरीके से कर सकता है।)
बूटस्ट्रैप क्लासपथ
एक्सटेंशन और एप्लिकेशन क्लासपाथ की जांच करने से पहले, सामान्य जावा क्लास लोडर बूटस्ट्रैप क्लासपाथ में पहली कक्षा के लिए दिखते हैं। डिफ़ॉल्ट रूप से, बूटस्ट्रैप classpath में "rt.jar" फ़ाइल और कुछ अन्य महत्वपूर्ण JAR फाइलें होती हैं जो JRE इंस्टॉलेशन द्वारा आपूर्ति की जाती हैं। ये सभी मानक जावा एसई क्लास लाइब्रेरी में विभिन्न "आंतरिक" कार्यान्वयन कक्षाओं के साथ सभी कक्षाएं प्रदान करते हैं।
सामान्य परिस्थितियों में, आपको इसके साथ खुद को चिंता करने की आवश्यकता नहीं है। डिफ़ॉल्ट रूप से, java
, javac
और जैसे कमांड रनटाइम लाइब्रेरीज़ के उपयुक्त संस्करणों का उपयोग करेंगे।
कभी-कभी मानक पुस्तकालयों में एक वर्ग के वैकल्पिक संस्करण का उपयोग करके जावा रनटाइम के सामान्य व्यवहार को ओवरराइड करना आवश्यक होता है। उदाहरण के लिए, आप रनटाइम पुस्तकालयों में एक "शो स्टॉपर" बग का सामना कर सकते हैं जिसे आप सामान्य तरीकों से काम नहीं कर सकते हैं। ऐसी स्थिति में, एक JAR फ़ाइल बनाना संभव है जिसमें परिवर्तित वर्ग हो और फिर इसे बूटस्ट्रैप क्लासपाथ में जोड़ा जाए जो JVM लॉन्च कर रहा है।
java
कमांड बूटस्ट्रैप क्लासपथ को संशोधित करने के लिए निम्नलिखित -X
विकल्प प्रदान करता है:
-
-Xbootclasspath:<path>
वर्तमान बूट क्लासपाथ को दिए गए पथ से बदल देता है। -
-Xbootclasspath/a:<path>
वर्तमान बूट क्लासपाथ को प्रदान किया गया पथ जोड़ता है। -
-Xbootclasspath/p:<path>
मौजूदा बूट क्लासपाथ को प्रदान किए गए पथ को प्रस्तुत करता है।
ध्यान दें कि जब बूटक्लासपैथ विकल्प जावा क्लास (वगैरह) को बदलने या ओवरराइड करने के लिए उपयोग करते हैं, तो आप तकनीकी रूप से जावा को संशोधित कर रहे हैं। यदि आपके पास अपना कोड वितरित करता है तो लाइसेंस के निहितार्थ हो सकते हैं । (जावा बाइनरी लाइसेंस के नियमों और शर्तों का संदर्भ लें ... और एक वकील से परामर्श करें।)