क्लासपैथ क्या है और मैं इसे कैसे सेट करूं?


324

मैं अभी यह पंक्ति पढ़ रहा था:

पहली चीज़ जो प्रारूप () विधि करती है, वह आउटपुट नाम से classpath से वेलोसिटी टेम्पलेट लोड करती है

कृपया बताएं कि इस संदर्भ में क्लासपाथ का क्या मतलब था, और मुझे क्लासपाथ कैसे सेट करना चाहिए।

जवाबों:


530

जावा में प्रोग्रामिंग करते समय, आप अपनी स्रोत फ़ाइल के शीर्ष पर इस तरह से कुछ लिखकर कक्षा को उपलब्ध कराते हैं:

import org.javaguy.coolframework.MyClass;

या कभी-कभी आप कह कर 'थोक आयात' सामान लेते हैं:

import org.javaguy.coolframework.*;

इसलिए बाद में अपने कार्यक्रम में जब आप कहते हैं:

MyClass mine = new MyClass();

जावा वर्चुअल मशीन को पता चल जाएगा कि आपके संकलित वर्ग को कहां खोजना है।

आपकी मशीन पर प्रत्येक फ़ोल्डर के माध्यम से वीएम लुक रखना अव्यावहारिक होगा, इसलिए आपको वीएम को देखने के लिए स्थानों की एक सूची प्रदान करनी होगी। यह आपके क्लासपाथ पर फोल्डर और जार फाइल्स डालकर किया जाता है।

इससे पहले कि हम इस बारे में बात करें कि क्लासपैथ कैसे सेट किया जाता है, आइए .class फ़ाइलों, पैकेजों और .jar फ़ाइलों के बारे में बात करते हैं।

सबसे पहले, मान लें कि MyClass कुछ ऐसा है जिसे आपने अपनी परियोजना के हिस्से के रूप में बनाया है, और यह आपके प्रोजेक्ट नामक निर्देशिका में है output। .Class फ़ाइल में होगीoutput/org/javaguy/coolframework/MyClass.class उस पैकेज (हर दूसरी फ़ाइल के साथ) होगी। उस फ़ाइल को प्राप्त करने के लिए, आपके पथ को केवल फ़ोल्डर 'आउटपुट' को शामिल करने की आवश्यकता होगी, न कि पूरे पैकेज संरचना को, क्योंकि आपका आयात विवरण VM को वह सभी जानकारी प्रदान करता है।

अब मान लेते हैं कि आप CoolFramework को एक .jar फ़ाइल में बंडल करते हैं, और उस CoolFramework.jar को अपनी परियोजना में एक कार्यकारी निर्देशिका में डालते हैं। अब आपको lib/CoolFramework.jarअपने वर्गपथ में डालने की आवश्यकता होगी । वीएम org/javaguy/coolframeworkभाग के लिए जार फ़ाइल के अंदर दिखेगा , और अपनी कक्षा खोजें।

तो, क्लासपैथ में शामिल हैं:

  • जार फाइलें, और
  • पैकेज पदानुक्रम के शीर्ष पर पथ।

आप अपना वर्गपथ कैसे निर्धारित करते हैं?

सभी को सीखने का पहला तरीका पर्यावरण चर के साथ है। यूनिक्स मशीन पर, आप कुछ ऐसा कह सकते हैं:

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

विंडोज मशीन पर आपको अपने पर्यावरण सेटिंग्स पर जाना होगा और पहले से मौजूद मूल्य को जोड़ना या संशोधित करना होगा।

दूसरा तरीका -cpजावा शुरू करते समय पैरामीटर का उपयोग करना है , जैसे:

java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

इसका एक प्रकार तीसरा तरीका है जो अक्सर एक .shया .batफ़ाइल के साथ किया जाता है जो क्लासपाथ की गणना करता है और इसे -cpपैरामीटर के माध्यम से जावा में भेजता है।

उपरोक्त सभी के साथ एक "गोच" है। अधिकांश प्रणालियों (लिनक्स, मैक ओएस, यूनिक्स, आदि) पर बृहदान्त्र वर्ण (':') क्लासपैथ विभाजक है। विंडोम में विभाजक अर्धविराम ('?') है

तो इसे करने का सबसे अच्छा तरीका क्या है?

पर्यावरण चर के माध्यम से वैश्विक स्तर पर सामान की स्थापना खराब है, आमतौर पर इसी तरह के कारणों से कि वैश्विक चर खराब हैं। आप CLASSPATH परिवेश वैरिएबल को बदलते हैं ताकि एक प्रोग्राम काम करता है, और आप दूसरे प्रोग्राम को तोड़ते हैं।

-Cp जाने का रास्ता है। मैं आमतौर पर सुनिश्चित करता हूं कि मेरा CLASSPATH पर्यावरण चर एक खाली स्ट्रिंग है जहां मैं विकसित करता हूं, जब भी संभव हो, ताकि मैं वैश्विक क्लासपैथ मुद्दों से बचूं (कुछ उपकरण तब खुश नहीं होते हैं जब वैश्विक क्लासपैथ खाली होता है - मुझे दो सामान्य, मेगा-हजार का पता है डॉलर लाइसेंस प्राप्त J2EE और जावा सर्वर जिनके पास इस तरह की समस्या उनके कमांड-लाइन टूल्स के साथ है)।



अजगर में लिब नाम का एक फोल्डर होता है जहां आप किसी भी मॉड्यूल को साधारण आयात स्टेटमेंट के साथ किसी भी समय उपयोग करने के लिए स्टोर कर सकते हैं। क्या यह तृतीय-पक्ष जावा संकुल के लिए CLASSPATH पर्यावरण चर को एक निर्देशिका में स्थापित करने से अलग है? भले ही यह वैश्विक होगा, अधिक पैकेज जोड़ने के अलावा, चर को बदलने की कोई आवश्यकता नहीं होगी।
जोसी थॉम्पसन

अच्छा जवाब है, लेकिन यहाँ डमी के लिए: आपको अपने द्वारा बनाए गए प्रत्येक नए वर्ग के लिए -cp कमांड का उपयोग करने की आवश्यकता क्यों नहीं है? यह निश्चित रूप से आपके सिस्टम द्वारा सही तरीके से हल किया गया है? पर कैसे? मुझे कभी-कभी एक समस्या आती है जहां "कुछ" मेरे क्लासपाथ में नहीं मिल सकता है - मुझे लगता है कि ऐसा इसलिए है क्योंकि मैंने इसे सीपी में नहीं जोड़ा था, लेकिन ऐसी त्रुटि हमेशा के बजाय कभी-कभी ही क्यों होती है? मैं यह पूछता हूं, क्योंकि ईमानदार होने के लिए, मैंने कभी भी कुछ भी मैन्युअल रूप से शामिल नहीं किया था -cp कमांड और पता नहीं क्या होगा जैसे त्रुटि के साथ
विक टोरेंट

2
@Vicpath को निर्देशिका के पदानुक्रम से ऊपर की निर्देशिका को पैकेज नाम में शामिल करने की आवश्यकता है। इसलिए, यदि मेरे पास org.javaguy.coolfwसंगत निर्देशिका संरचना है /path/to/org/javaguy/coolfw/, तो क्लासपैथ को समाहित करना होगा /path/to/। यदि मैं org.javaguy.hotfwउसी परियोजना में एक नया पैकेज जोड़ता हूं , तो परिणामी वर्ग (आमतौर पर) समाप्त होता है /path/to/org/javaguy/hotfw/। इसके लिए क्लासपैथ को समाहित करने की आवश्यकता है /path/to/, जो यह पहले से ही करता है। इसलिए नए पैकेज (और उसमें निहित कक्षाएं) को क्लासपाथ के लिए नए अतिरिक्त की आवश्यकता नहीं है।
tjalling

@Vic अधिक ठोस उदाहरण और स्पष्टीकरण के लिए, Java CLASSPATH (प्रति KNU की उत्कृष्ट टिप्पणी ) को देखें
tjalling 16

67

इसे पाथ पर्यावरण चर के जावा के जवाब के रूप में सोचें - पाथ पर ओएसई खोजते हैं, जावा वर्गपथ पर कक्षाओं और पैकेजों की खोज करते हैं।


13

क्लासपाथ वह पथ है जहाँ जावा वर्चुअल मशीन जावा प्रोग्राम में उपयोगकर्ता-परिभाषित कक्षाओं, पैकेजों और संसाधनों के लिए देखती है।

इस संदर्भ में, format()विधि इस पथ से एक टेम्पलेट फ़ाइल लोड करती है।


5

इस संदर्भ में क्लासपाथ वास्तव में वही है जो सामान्य संदर्भ में है: कहीं भी वीएम जानता है कि यह कक्षाओं को लोड करने के लिए मिल सकता है, और संसाधनों के साथ-साथ (जैसे आपके मामले में output.vm)।

मुझे लगता है कि वेग को "नो पैकेज" में कहीं भी आउटपुट नाम की एक फाइल खोजने की उम्मीद है। यह एक JAR, नियमित फ़ोल्डर हो सकता है, ... अनुप्रयोग के वर्गपथ में किसी भी स्थान का मूल।


2

CLASSPATH सिस्टम चर को सेट करना

वर्तमान CLASSPATH चर को प्रदर्शित करने के लिए, Windows और UNIX (बॉर्न शेल) में इन कमांड का उपयोग करें: In Windows: C:\> set CLASSPATH UNIX में: % echo $CLASSPATH

CLASSPATH चर की वर्तमान सामग्री को हटाने के लिए, इन आदेशों का उपयोग करें: Windows में: C:\> set CLASSPATH= UNIX में: % unset CLASSPATH; export CLASSPATH

CLASSPATH चर सेट करने के लिए, इन कमांड्स का उपयोग करें (उदाहरण के लिए): विंडोज में: C:\> set CLASSPATH=C:\users\george\java\classes UNIX में: % CLASSPATH=/home/george/java/classes; export CLASSPATH


1
हालांकि ये आदेश पर्यावरण चर के साथ काम करने के लिए उपयोगी हो सकते हैं, यह प्रश्न का उत्तर नहीं देता है
हल्क

1

क्लासपाथ सिस्टम का एक पर्यावरण चर है। इस चर की सेटिंग का उपयोग जावा कंपाइलर को किसी भी पैकेज पदानुक्रम की जड़ प्रदान करने के लिए किया जाता है।


1

CLASSPATH जावा कंपाइलर और रनटाइम के लिए जावा प्रोग्राम में इस्तेमाल होने वाले जावा पैकेज का पता लगाने के लिए एक पर्यावरण चर (यानी, सभी प्रक्रियाओं के लिए उपलब्ध ऑपरेटिंग सिस्टम का वैश्विक चर) है। (क्यों नहीं PACKAGEPATH कहा जाता है?) यह एक अन्य पर्यावरण चर पथ के समान है, जिसका उपयोग सीएमडी शेल द्वारा निष्पादन योग्य कार्यक्रमों को खोजने के लिए किया जाता है।

CLASSPATH को निम्न तरीकों में से एक में सेट किया जा सकता है:

CLASSPATH can be set permanently in the environment: In Windows, choose control panel  System  Advanced  Environment Variables  choose "System Variables" (for all the users) or "User Variables" (only the currently login user)  choose "Edit" (if CLASSPATH already exists) or "New"  Enter "CLASSPATH" as the variable name  Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.

To check the current setting of the CLASSPATH, issue the following command:

> SET CLASSPATH

CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:

> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar

Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,

> java classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3

0

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


0

Linux उपयोगकर्ताओं के लिए, और दूसरों के लिए यहाँ जो कुछ भी कहा गया है, उसे जोड़ना और जोड़ना, आपको निम्नलिखित जानना चाहिए:

  1. $ CLASSPATH वह है जो जावा आपकी स्क्रिप्ट के लिए आवश्यक सभी अलग-अलग वर्गों को खोजने के लिए कई निर्देशिकाओं के माध्यम से देखने के लिए उपयोग करता है (जब तक कि आप स्पष्ट रूप से इसे -cp ओवरराइड के साथ नहीं बताते हैं)। का उपयोग करते हुए -cp की आवश्यकता है कि आप मैन्युअल रूप से सभी निर्देशिकाओं का ट्रैक रखें और हर बार जब आप प्रोग्राम को चलाते हैं तो कॉपी-पेस्ट करें (बेहतर तरजीही नहीं)।

  2. बृहदान्त्र (":") वर्ण अलग-अलग निर्देशिकाओं को अलग करता है। केवल एक $ CLASSPATH है और इसमें सभी निर्देशिकाएं हैं। इसलिए, जब आप "निर्यात क्लास = ..." चलाते हैं, तो आप इसे संलग्न करने के लिए वर्तमान मूल्य "$ क्लास" को शामिल करना चाहते हैं। उदाहरण के लिए:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar

    ऊपर की पहली पंक्ति में, आप CLASSPATH को केवल एक सरल 'डॉट' के साथ शुरू करते हैं, जो आपकी वर्तमान कार्यशील निर्देशिका का मार्ग है। इसके साथ, जब भी आप जावा चलाते हैं तो यह कक्षाओं के लिए वर्तमान कार्यशील निर्देशिका (आप जिस में हैं) में दिखेगा। ऊपर की दूसरी पंक्ति में, $ CLASSPATH उस मान को पकड़ लेता है जो आपने पहले दर्ज किया था ()। और mysql dirver के लिए पथ जोड़ता है। अब, जावा ड्राइवर के लिए और आपकी कक्षाओं के लिए दिखेगा।

  3. echo $CLASSPATH

    सुपर आसान है, और यह क्या रिटर्न सभी निर्देशिकाओं की एक बृहदान्त्र से अलग सूची की तरह पढ़ा जाना चाहिए, और .jar फ़ाइलें, आप जावा वर्ग की जरूरत के लिए देख रहे हैं चाहता हूँ।

  4. टॉमकैट CLASSPATH का उपयोग नहीं करता है। उस बारे में यहां क्या करें पढ़ें: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.