एक सामान्य समस्या जो नए जावा डेवलपर्स अनुभव करते हैं कि उनके प्रोग्राम त्रुटि संदेश के साथ चलने में विफल रहते हैं: Could not find or load main class ...
इसका क्या मतलब है, यह क्या कारण है, और आपको इसे कैसे ठीक करना चाहिए?
एक सामान्य समस्या जो नए जावा डेवलपर्स अनुभव करते हैं कि उनके प्रोग्राम त्रुटि संदेश के साथ चलने में विफल रहते हैं: Could not find or load main class ...
इसका क्या मतलब है, यह क्या कारण है, और आपको इसे कैसे ठीक करना चाहिए?
जवाबों:
java <class-name>
आदेश वाक्य रचनासबसे पहले, आपको java
(या javaw
) कमांड का उपयोग करके प्रोग्राम लॉन्च करने के सही तरीके को समझने की आवश्यकता है ।
सामान्य वाक्यविन्यास 1 यह है:
java [ <options> ] <class-name> [<arg> ...]
जहां <option>
एक कमांड लाइन विकल्प है ("-" वर्ण के साथ शुरू होता है), <class-name>
एक पूरी तरह से योग्य जावा क्लास नाम है, और <arg>
एक मनमाना कमांड लाइन तर्क है जो आपके एप्लिकेशन को पास हो जाता है।
1 - कुछ अन्य वाक्यविन्यास हैं जो इस उत्तर के अंत में वर्णित हैं।
वर्ग के लिए पूरी तरह से योग्य नाम (FQN) पारंपरिक रूप से लिखा गया है जैसा कि आप जावा स्रोत कोड में होगा; जैसे
packagename.packagename2.packagename3.ClassName
हालाँकि java
कमांड के कुछ संस्करण आपको अवधियों के बजाय स्लैश का उपयोग करने की अनुमति देते हैं; जैसे
packagename/packagename2/packagename3/ClassName
जो (भ्रामक रूप से) फ़ाइल पथनाम की तरह दिखता है, लेकिन एक नहीं है। ध्यान दें कि शब्द पूरी तरह से योग्य नाम मानक जावा शब्दावली है ... ऐसा कुछ नहीं है जिसे मैंने सिर्फ आपको भ्रमित करने के लिए बनाया है :-)
यहाँ एक उदाहरण है कि java
कमांड को कैसा दिखना चाहिए:
java -Xmx100m com.acme.example.ListUsers fred joe bert
ऊपर java
कमांड निम्नलिखित को करने का कारण बनने जा रहा है :
com.acme.example.ListUsers
कक्षा के संकलित संस्करण की खोज करें ।main
विधि है । (ध्यान दें, विधि तर्क का नाम हस्ताक्षर का हिस्सा नहीं है ।)public static void main(String[])
String[]
।जब आपको संदेश मिलता है "मुख्य वर्ग को ढूंढ या लोड नहीं कर सका ...", इसका मतलब है कि पहला चरण विफल हो गया है। java
आदेश वर्ग को खोजने के लिए सक्षम नहीं था। और वास्तव में, संदेश में "..." पूरी तरह से योग्य वर्ग नाम होगा जो java
खोज रहा है।
तो यह वर्ग खोजने में असमर्थ क्यों हो सकता है?
पहला संभावित कारण यह है कि आपने गलत श्रेणी का नाम प्रदान किया होगा। (या सही वर्ग का नाम, लेकिन गलत रूप में।) ऊपर दिए गए उदाहरण को ध्यान में रखते हुए, वर्ग नाम निर्दिष्ट करने के लिए कई तरह के गलत तरीके हैं:
उदाहरण # 1 - एक साधारण वर्ग का नाम:
java ListUser
जब क्लास को पैकेज के रूप में घोषित किया जाता है com.acme.example
, तो आपको कमांड में पैकेज नाम सहित पूर्ण क्लासनाम का उपयोग करना होगा java
; जैसे
java com.acme.example.ListUser
उदाहरण # 2 - एक वर्ग नाम के बजाय एक फ़ाइल नाम या पथनाम:
java ListUser.class
java com/acme/example/ListUser.class
उदाहरण # 3 - आवरण गलत के साथ एक वर्ग का नाम:
java com.acme.example.listuser
उदाहरण # 4 - एक टाइपो
java com.acme.example.mistuser
उदाहरण # 5 - एक स्रोत फ़ाइल नाम (जावा 11 को छोड़कर या बाद में; नीचे देखें)
java ListUser.java
उदाहरण # 6 - आप पूरी तरह से वर्ग का नाम भूल गए
java lots of arguments
दूसरा संभावित कारण यह है कि वर्ग का नाम सही है, लेकिन यह कि java
कमांड वर्ग को नहीं ढूंढ सकता है। इसे समझने के लिए, आपको "क्लासपाथ" की अवधारणा को समझने की आवश्यकता है। यह ओरेकल प्रलेखन द्वारा अच्छी तरह से समझाया गया है:
java
आदेश प्रलेखनइसलिए ... यदि आपने कक्षा का नाम सही ढंग से निर्दिष्ट किया है, तो जांच करने के लिए अगली बात यह है कि आपने कक्षापथ को सही ढंग से निर्दिष्ट किया है:
java
कमांड । जाँचें कि निर्देशिका नाम और JAR फ़ाइल नाम सही हैं।java
कमांड ।;
विंडोज पर है और:
पर और अन्य पर है। यदि आप अपने प्लेटफ़ॉर्म के लिए गलत विभाजक का उपयोग करते हैं, तो आपको एक स्पष्ट त्रुटि संदेश नहीं मिलेगा। इसके बजाय, आपको उस पथ पर कोई न कोई फ़ाइल या निर्देशिका मिल जाएगी जिसे चुपचाप अनदेखा कर दिया जाएगा। ।)जब आप क्लासपाथ पर एक निर्देशिका डालते हैं, तो यह विशेष रूप से योग्य नाम स्थान की जड़ से मेल खाती है। कक्षाएं रूट के नीचे निर्देशिका संरचना में स्थित होती हैं, पूरी तरह से योग्य नाम को एक मार्गनाम से मैप करके । उदाहरण के लिए, यदि "/ usr / स्थानीय / acme / कक्षाएं" वर्ग पथ पर है, तो जब JVM नामक एक वर्ग की तलाश करता है com.acme.example.Foon
, तो वह इस पथनाम के साथ ".class" फ़ाइल की तलाश करेगा:
/usr/local/acme/classes/com/acme/example/Foon.class
अगर आपने क्लासपैथ पर "/ usr / स्थानीय / acme / classes / com / acme / उदाहरण" रखा था, तो JVM क्लास को खोजने में सक्षम नहीं होगा।
यदि आपकी कक्षाएं FQN है com.acme.example.Foon
, तो JVM "कॉम / acme / उदाहरण" निर्देशिका में "Foon.class" देखने जा रहा है:
यदि आपकी निर्देशिका संरचना उपरोक्त पैटर्न के अनुसार पैकेज के नामकरण से मेल नहीं खाती है, तो JVM आपकी कक्षा को नहीं खोजेगा।
यदि आप इसे स्थानांतरित करके एक वर्ग का नाम बदलने का प्रयास करते हैं, तो यह भी विफल हो जाएगा ... लेकिन अपवाद स्टैकट्रेस अलग होगा। यह इस तरह से कुछ कहने के लिए उत्तरदायी है:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
क्योंकि क्लास फ़ाइल में FQN मैच नहीं करता है जो क्लास लोडर को खोजने की उम्मीद कर रहा है।
एक ठोस उदाहरण देने के लिए, यह मानते हुए कि:
com.acme.example.Foon
क्लास चलाना चाहते हैं ,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,फिर:
# wrong, FQN is needed
java Foon
# wrong, there is no `com/acme/example` folder in the current working directory
java com.acme.example.Foon
# wrong, similar to above
java -classpath . com.acme.example.Foon
# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon
# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon
टिप्पणियाँ:
-classpath
विकल्प के लिए छोटा किया जा सकता -cp
सबसे जावा विज्ञप्ति में। संबंधित मैनुअल प्रविष्टियों की जाँच करें java
, javac
और इसी तरह।क्लासपैथ को अन्य (गैर-प्रणाली) वर्गों में से सभी को शामिल करने की आवश्यकता है जो आपके आवेदन पर निर्भर करता है। (सिस्टम कक्षाएं स्वचालित रूप से स्थित हैं, और आपको शायद ही कभी इसके साथ खुद को चिंता करने की आवश्यकता है।) सही तरीके से लोड करने के लिए मुख्य वर्ग के लिए, जेवीएम को खोजने की आवश्यकता है:
(नोट: JLS और JVM विनिर्देश JVM के लिए वर्गों को "आलसी" लोड करने के लिए कुछ गुंजाइश की अनुमति देते हैं, और यह तब प्रभावित हो सकता है जब एक क्लास लोडर अपवाद को फेंक दिया जाता है।)
यह कभी-कभी ऐसा होता है कि कोई व्यक्ति स्रोत कोड फ़ाइल को अपने स्रोत कोड ट्री में गलत फ़ोल्डर में डालता है, या वे package
घोषणा को छोड़ देते हैं । यदि आप एक आईडीई में ऐसा करते हैं, तो आईडीई का कंपाइलर आपको तुरंत इस बारे में बताएगा। इसी तरह यदि आप एक सभ्य जावा बिल्ड टूल का उपयोग करते हैं, तो उपकरण javac
एक तरह से चलेगा जिससे समस्या का पता चलेगा। हालाँकि, यदि आप अपने जावा कोड को हाथ से बनाते हैं, तो आप इसे इस तरह से कर सकते हैं कि कंपाइलर को समस्या का आभास न हो और परिणामस्वरूप ".class" फ़ाइल उस स्थान पर न हो, जहाँ आप उसके होने की उम्मीद करते हैं।
जांच करने के लिए बहुत सी चीजें हैं, और कुछ को याद करना आसान है। कमांड लाइन के -Xdiag
विकल्प को जोड़ने का प्रयास करें java
(बाद में पहली चीज के रूप में java
)। यह क्लास लोडिंग के बारे में विभिन्न चीजों का उत्पादन करेगा, और यह आपको सुराग दे सकता है कि वास्तविक समस्या क्या है।
इसके अलावा, वेबसाइटों, दस्तावेज़ों आदि से अदृश्य या गैर-एएससीआईआई पात्रों को कॉपी और पेस्ट करने के कारण होने वाली संभावित समस्याओं पर विचार करें। और "सजातीय" पर विचार करें, क्या दो अक्षर थे या प्रतीक समान दिखते हैं ... लेकिन नहीं हैं।
अंत में, आप जाहिरा तौर पर इस समस्या में भाग सकते हैं यदि आप JAR फ़ाइल से गलत हस्ताक्षर के साथ लॉन्च करने का प्रयास करते हैं (META-INF/*.SF)
।
java
का उपयोग करते हुए लॉन्चिंग जावा प्रोग्राम के लिए तीन वैकल्पिक वाक्यविन्यास हैं java command
।
1) "एक्जीक्यूटेबल" JAR फ़ाइल लॉन्च करने के लिए इस्तेमाल किया गया सिंटैक्स इस प्रकार है:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
जैसे
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
प्रवेश बिंदु वर्ग (यानी com.acme.example.ListUser
) और वर्गपथ का नाम जार फ़ाइल के मैनिफेस्ट में निर्दिष्ट किया गया है।
2) एक मॉड्यूल (जावा 9 और बाद के) से एक एप्लिकेशन को लॉन्च करने के लिए सिंटैक्स निम्नानुसार है:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
एंट्रीपॉइंट क्लास का नाम या तो <module>
स्वयं द्वारा परिभाषित किया गया है, या वैकल्पिक द्वारा दिया गया है <mainclass>
।
3) जावा 11 के बाद, आप एक एकल स्रोत कोड फ़ाइल को संकलित और चला सकते हैं और इसे निम्नलिखित सिंटैक्स के साथ चला सकते हैं:
java [ <options> ] <sourcefile> [<arg> ...]
जहां (आमतौर पर) प्रत्यय "। जावा" के साथ एक फ़ाइल है।
अधिक विवरण के लिए, कृपया java
जावा रिलीज़ के लिए कमांड के आधिकारिक दस्तावेज देखें, जो आप उपयोग कर रहे हैं।
एक सामान्य जावा आईडीई में स्वयं या बच्चे के जेवीएम में आईडीई जेवीएम में जावा अनुप्रयोगों को चलाने के लिए समर्थन है। ये हैं आम तौर पर , इस विशेष अपवाद से प्रतिरक्षा क्योंकि आईडीई का अपना तंत्र का उपयोग करता है, क्रम classpath का निर्माण मुख्य वर्ग की पहचान करने और बनाने के लिए java
कमांड लाइन।
हालाँकि इस अपवाद के लिए अभी भी संभव है, अगर आप आईडीई के पीछे की चीजें करते हैं। उदाहरण के लिए, यदि आपने पहले ग्रहण में अपने जावा ऐप के लिए एक एप्लिकेशन लॉन्चर स्थापित किया है, और आपने तब JAR फ़ाइल को स्थानांतरित कर दिया है, जिसमें "मुख्य" वर्ग होता है, जो ग्रहण को बताए बिना फाइल सिस्टम में एक अलग स्थान पर है , तो ग्रहण जेवीएम को खोल देगा। गलत क्लासपैथ के साथ।
संक्षेप में, यदि आपको आईडीई में यह समस्या आती है, तो बासी आईडीई राज्य, टूटे हुए प्रोजेक्ट संदर्भ या टूटे हुए लांचर कॉन्फ़िगरेशन जैसी चीजों की जांच करें।
आईडीई के लिए केवल भ्रमित होना भी संभव है। आईडीई सॉफ्टवेयर के बेहद जटिल टुकड़े हैं जिनमें कई अंतःक्रियात्मक भाग शामिल हैं। इनमें से कई हिस्से आईडीई को संपूर्ण उत्तरदायी बनाने के लिए विभिन्न कैशिंग रणनीतियों को अपनाते हैं। ये कभी-कभी गलत हो सकते हैं, और अनुप्रयोगों को लॉन्च करते समय एक संभावित लक्षण समस्या है। यदि आपको संदेह है कि यह हो रहा है, तो यह आपके आईडीई को फिर से शुरू करने, परियोजना के पुनर्निर्माण और इतने पर जैसे अन्य चीजों की कोशिश करने के लायक है।
java -cp ../third-party-library.jar com.my.package.MyClass
; यह काम नहीं करता है, इसके बजाय यह आवश्यक है कि स्थानीय फ़ोल्डर को वर्ग पथ के साथ जोड़ा जाए ( :
इस तरह अलग किया गया है : java -cp ../third-party-library.jar:. com.my.package.MyClass
फिर, यह काम करना चाहिए
java
होता है कि यह नहीं कहता कि यह एक आयातित वर्ग नहीं है, लेकिन इसके बजाय मुख्य वर्ग जिसे आप चलाने की कोशिश कर रहे हैं। यह भ्रामक है, हालांकि मुझे यकीन है कि इसके लिए एक कारण है। मेरे पास ऐसा मामला java
था जहाँ मुझे पता था कि मेरी कक्षा कहाँ है, हालाँकि यह आयातित कक्षाओं में से एक को नहीं खोज सका। ऐसा कहने के बजाय, इसने मेरी मुख्य कक्षा नहीं ढूंढने के बारे में शिकायत की। सच में, annoing।
यदि आपके स्रोत कोड का नाम HelloWorld.java है, तो आपका संकलित कोड होगा HelloWorld.class
।
यदि आप इसका उपयोग करके कॉल करते हैं, तो आपको वह त्रुटि मिलेगी:
java HelloWorld.class
इसके बजाय, इसका उपयोग करें:
java HelloWorld
javac TestCode.java
द्वारा पीछा कियाjava TestCode
java -classpath . HelloWorld
यदि आपकी कक्षाएं संकुल में हैं, तो आपको cd
अपनी परियोजना की मूल निर्देशिका में जाना होगा और वर्ग के पूर्ण रूप से योग्य नाम (packageName.MainClassName) का उपयोग करके चलाना होगा।
उदाहरण:
मेरी कक्षाएं यहाँ हैं:
D:\project\com\cse\
मेरे मुख्य वर्ग का पूरी तरह से योग्य नाम है:
com.cse.Main
इसलिए मैं cd
रूट प्रोजेक्ट निर्देशिका पर वापस आता हूं :
D:\project
फिर java
आदेश जारी करें :
java com.cse.Main
यह उत्तर नौसिखिया जावा प्रोग्रामर को एक सामान्य गलती के कारण हताशा से बचाने के लिए है, मैं आपको जावा क्लासपथ के बारे में अधिक गहराई से ज्ञान के लिए स्वीकृत उत्तर पढ़ने की सलाह देता हूं।
यदि आप मुख्य वर्ग और मुख्य विधि को परिभाषित करते हैंpackage
, तो आपको इसे श्रेणी के पूर्ण नाम ( packageName.MainClassName
) का उपयोग करके, श्रेणीबद्ध निर्देशिका पर चलाना चाहिए ।
मान लें कि कोई स्रोत कोड फ़ाइल है (Main.java):
package com.test;
public class Main {
public static void main(String[] args) {
System.out.println("salam 2nya\n");
}
}
इस कोड को चलाने के लिए, आपको Main.Class
निर्देशिका जैसे पैकेज में जगह चाहिए ./com/test/Main.Java
। और रूट डायरेक्टरी उपयोग में java com.test.Main
।
जब समान कोड एक पीसी पर काम करता है, लेकिन यह दूसरे में त्रुटि दिखाता है, जो सबसे अच्छा समाधान मैंने कभी पाया है वह निम्नलिखित की तरह संकलित कर रहा है:
javac HelloWorld.java
java -cp . HelloWorld
javac -classpath . HelloWorld.java
से काम किया होगा! और यह आपके मामले में बेहतर समाधान है।
उदाहरण के लिए, कमांड लाइन पर क्लासपाथ को निर्दिष्ट करने में मुझे क्या मदद मिली:
एक नया फ़ोल्डर बनाएं, C:\temp
C:\temp
इसमें निम्न वर्ग के साथ, फ़ाइल Temp.java बनाएँ :
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
फ़ोल्डर में एक कमांड लाइन खोलें C:\temp
, और टेंप क्लास को संकलित करने के लिए निम्न कमांड लिखें:
javac Temp.java
संकलित जावा क्लास को चलाएं, -classpath
JRE को यह बताने के लिए विकल्प जोड़ें कि कक्षा को कहाँ खोजें:
java -classpath C:\temp Temp Hello!
java
$ CLASSPATH को नहीं देख रहा था (क्योंकि आपने -क्लासपैथ या -जर का इस्तेमाल किया था) या 2) क्लासपैथ सेटिंग उस वातावरण में सेट नहीं की गई थी जो उस संदर्भ में प्रभावी नहीं java
था Daud; उदाहरण के लिए, क्योंकि आपने उस फ़ाइल को "स्रोत" नहीं किया है, जहां सेटनव कमांड को सही शेल में जोड़ा गया है।
त्रुटि संदेश के अनुसार ("मुख्य वर्ग को ढूंढ या लोड नहीं कर सका"), समस्याओं की दो श्रेणियां हैं:
मुख्य वर्ग तब नहीं पाया जा सकता है जब पूरी तरह से योग्य वर्ग के नाम में टाइपो या गलत सिंटैक्स हो या प्रदान की गई क्लासपाथ में यह मौजूद नहीं है ।
जब क्लास शुरू नहीं की जा सकती तो मुख्य वर्ग को लोड नहीं किया जा सकता है , आम तौर पर मुख्य वर्ग एक और वर्ग प्रदान करता है और उस वर्ग प्रदान की classpath में मौजूद नहीं है।
उदाहरण के लिए:
public class YourMain extends org.apache.camel.spring.Main
यदि ऊंट-वसंत शामिल नहीं है, तो यह त्रुटि रिपोर्ट की जाएगी।
extends
)। मैंने अभी मुश्किल तरीका सीखा है कि जब मुख्य वर्ग लोड करने में विफल रहता है क्योंकि यह एक और विस्तार करता है जो नहीं मिल सकता है , जावा रिपोर्ट नहीं करता है कि कौन सा वास्तविक वर्ग नहीं मिला (विपरीत NoClassDefFoundError
)। तो हाँ ऐसा होता है, और यह एक बाल खींचने की स्थिति है जब आपको यह नहीं पता है।
इस मामले में मेरी ऐसी त्रुटि थी:
java -cp lib.jar com.mypackage.Main
यह ;
विंडोज के लिए और :
यूनिक्स के लिए काम करता है :
java -cp lib.jar; com.mypackage.Main
Main
JAR फ़ाइल में नहीं है। -cp lib.jar;
इसका मतलब वही है -cp lib.jar;.
जो मौजूदा निर्देशिका क्लासपाथ पर शामिल है।
कोशिश -Xdiag ।
स्टीव सी का जवाब संभव मामलों को अच्छी तरह से कवर करता है, लेकिन कभी-कभी यह निर्धारित करने के लिए कि क्या क्लास नहीं पाया जा सकता है या लोड नहीं किया जा सकता है। उपयोग करें java -Xdiag
(JDK 7 के बाद से)। यह एक अच्छा स्टैकट्रेस प्रिंट करता है जो संदेश को एक संकेत प्रदान करता हैCould not find or load main class
संदेश का अर्थ है।
उदाहरण के लिए, यह आपको मुख्य वर्ग द्वारा उपयोग की जाने वाली अन्य कक्षाओं के लिए इंगित कर सकता है, जिन्हें ढूंढा नहीं जा सकता है और मुख्य वर्ग को लोड करने से रोका जा सकता है।
इस कमांड का उपयोग करें:
java -cp . [PACKAGE.]CLASSNAME
उदाहरण: यदि आपका classname Hello.class Hello.java से बनाया गया है, तो नीचे दिए गए कमांड का उपयोग करें:
java -cp . Hello
यदि आपकी फ़ाइल Hello.java पैकेज com.demo के अंदर है, तो नीचे दिए गए कमांड का उपयोग करें
java -cp . com.demo.Hello
JDK 8 के साथ कई बार ऐसा होता है कि क्लास फाइल एक ही फोल्डर में मौजूद होती है, लेकिन java
कमांड को क्लासपैथ की उम्मीद होती है और इसी कारण से हम क्लास -cp .
फोल्डर के संदर्भ में वर्तमान फोल्डर को लेने के लिए जोड़ते हैं ।
-cp .
अनावश्यक है, क्योंकि यदि $CLASSPATH
कोई परेशान है, तो .
डिफ़ॉल्ट क्लासपैथ है।
echo %CLASSPATH%
आउटपुट क्या है ?) और नहीं, मैं जांच नहीं कर सकता क्योंकि मेरे पास विंडोज पीसी नहीं है।
कभी-कभी समस्या के कारण मुख्य वर्ग से कोई लेना-देना नहीं होता है, और मुझे इसका पता लगाना था। यह एक संदर्भित पुस्तकालय था जिसे मैंने स्थानांतरित किया, और इसने मुझे:
मुख्य वर्ग xxx लिनक्स को ढूंढ या लोड नहीं कर सका
मैंने बस उस संदर्भ को हटा दिया, इसे फिर से जोड़ा, और यह फिर से ठीक काम किया।
इस उदाहरण में आपके पास:
मुख्य वर्ग ? वर्गपथ को खोज या लोड नहीं कर सका
ऐसा इसलिए है क्योंकि आप "-classpath" का उपयोग कर रहे हैं, लेकिन डैश java
कमांड प्रॉम्प्ट पर उपयोग किए जाने वाले डैश नहीं है । मेरे पास नोटपैड से लेकर सेमी तक कॉपी और पेस्ट करने का यह मुद्दा था ।
मुझे एक ही समस्या थी और अंत में मुझे अपनी गलती का पता चला :) मैंने इस कमांड का इस्तेमाल संकलन के लिए किया और यह सही तरीके से काम करती है:
javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java
लेकिन यह कमांड मेरे लिए काम नहीं करता था (मैं मुख्य वर्ग को ढूंढ या लोड नहीं कर सका, qrcode
):
java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode
अंत में मैंने क्लासपैथ के अंत में ':' वर्ण जोड़ा और समस्या हल हो गई:
java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode
यदि आपका मामला विशेष रूप से मेरा है तो यह आपकी मदद कर सकता है: एक शुरुआत के रूप में मैं भी इस समस्या में भाग गया था जब मैंने जावा प्रोग्राम चलाने की कोशिश की थी।
मैंने इसे इस तरह संकलित किया है:
javac HelloWorld.java
और मैंने भी उसी विस्तार के साथ चलने की कोशिश की:
java Helloworld.java
जब मैंने हटा दिया .java
और जैसे आदेश को फिर से लिखा java HelloWorld
, तो कार्यक्रम पूरी तरह से चला। :)
यहां सभी उत्तर विंडोज उपयोगकर्ताओं के लिए निर्देशित हैं जो ऐसा लगता है। मैक के लिए, क्लासपैथ विभाजक है :
, नहीं ;
। क्लासपाथ को सेट करने में त्रुटि के रूप में उपयोग ;
नहीं किया जाता है, तो विंडोज से मैक पर आने पर यह पता लगाना मुश्किल हो सकता है।
यहाँ मैक आदेश इसी है:
java -classpath ".:./lib/*" com.test.MyClass
जहां इस उदाहरण में पैकेज है com.test
और lib
क्लासपथ पर एक फ़ोल्डर भी शामिल किया जाना है।
/*
जरूरी है?
वर्ग फ़ाइल स्थान: C: \ test \ com \ company
फ़ाइल का नाम: Main.class
पूरी तरह से योग्य वर्ग का नाम: com.company.Main
कमांड लाइन कमांड:
java -classpath "C:\test" com.company.Main
यहाँ ध्यान दें कि वर्ग पथ में \ com \ company शामिल नहीं है
मैंने इस समस्या को हल करने के लिए एक अच्छा समय बिताया। मैंने सोचा था कि मैं किसी तरह अपनी क्लासपाथ को गलत तरीके से सेट कर रहा था लेकिन समस्या यह थी कि मैंने टाइप किया था:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
के बजाय:
java -cp C:/java/MyClasses utilities/myapp/Cool
मुझे लगा कि पूर्ण पैकेज नाम के बजाय पूर्ण पथ नाम को शामिल करने का मतलब पूरी तरह से योग्य है।
utilities.myapp.Cool
अपने पैकेज के नाम के रूप में या यदि कोई हो, दिया जाना चाहिए ।
पहले इस कमांड का उपयोग करके पथ सेट करें;
set path="paste the set path address"
फिर आपको प्रोग्राम लोड करने की आवश्यकता है। संग्रहीत ड्राइव में "सीडी (फ़ोल्डर का नाम)" टाइप करें और इसे संकलित करें। उदाहरण के लिए, यदि मेरा प्रोग्राम डी ड्राइव पर संग्रहीत है, तो "D:" एंटर दबाएं और "cd (फ़ोल्डर का नाम)" टाइप करें।
if "cd" helps then it by luck rather than by judgement
। यह गलत है (मेरा मानना है), क्योंकि जावा .
डिफ़ॉल्ट रूप से क्लासपाथ के हिस्से के रूप में वर्तमान निर्देशिका का उपयोग करता है ।
मेरे मामले में समस्या क्या थी:
उस प्रोजेक्ट / वर्ग पर राइट क्लिक करें जिसे आप चलाना चाहते हैं, फिर Run As
-> Run Configurations
। फिर आपको अपने मौजूदा कॉन्फ़िगरेशन को ठीक करना चाहिए या निम्नलिखित तरीके से नया जोड़ना चाहिए:
Classpath
टैब खोलें , Advanced...
बटन पर क्लिक करें और फिर अपने प्रोजेक्ट का bin
फ़ोल्डर जोड़ें ।
यदि आप JAR फ़ाइल बनाने के लिए Maven का उपयोग करते हैं , तो कृपया pom.xml फ़ाइल में मुख्य वर्ग निर्दिष्ट करना सुनिश्चित करें:
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>class name us.com.test.abc.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
यह एक विशिष्ट मामला है, लेकिन जब से मैं इस पृष्ठ पर एक समाधान की तलाश में आया और इसे नहीं पाया, मैं इसे यहां जोड़ूंगा।
विंडोज (7 के साथ परीक्षण) विशेष वर्णों को स्वीकार नहीं करता है (जैसे) á
) वर्ग और पैकेज नामों में ) को । हालांकि लिनक्स करता है।
मुझे यह पता चला जब मैंने .jar
नेटबीन्स में निर्माण किया और इसे कमांड लाइन में चलाने की कोशिश की। यह नेटबींस में चला लेकिन कमांड लाइन में नहीं।
.;
शुरुआत में CLASSPATH मूल्य पर विंडोज पर डाल दिया ।
द। (डॉट) का अर्थ है "वर्तमान निर्देशिका में देखो"। यह एक स्थायी समाधान है।
इसके अलावा आप इसे "एक बार" सेट के साथ सेट कर सकते हैं CLASSPATH=%CLASSPATH%;.
। यह तब तक चलेगा जब तक कि आपकी cmd विंडो ओपन नहीं हो जाती।
आपको वास्तव में src
फ़ोल्डर से ऐसा करने की आवश्यकता है । वहाँ आप निम्न कमांड लाइन टाइप करें:
[name of the package].[Class Name] [arguments]
मान लीजिए कि आपकी कक्षा को बुलाया जाता है CommandLine.class
, और कोड इस तरह दिखता है:
package com.tutorialspoint.java;
/**
* Created by mda21185 on 15-6-2016.
*/
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
फिर आपको cd
src फोल्डर में जाना चाहिए और आपको जिस कमांड को चलाने की आवश्यकता है वह इस तरह दिखाई देगा:
java com.tutorialspoint.java.CommandLine this is a command line 200 -100
और कमांड लाइन पर आउटपुट होगा:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
cd
करना था src
और फिर java ../bin com.blah.blah.MyClass
मेरे लिए काम करना था। तो टिप के लिए धन्यवाद!
जावा में, जब आप कभी-कभी जावा निष्पादन योग्य का उपयोग करके कमांड लाइन से जेवीएम चलाते हैं और सार्वजनिक स्थैतिक शून्य मुख्य (पीएसवीएम) के साथ एक क्लास फ़ाइल से एक कार्यक्रम शुरू करने की कोशिश कर रहे हैं, तो आप क्लासपैड पैरामीटर के बावजूद भी नीचे की त्रुटि में भाग सकते हैं। जेवीएम सटीक है और क्लास फाइल क्लासपाथ पर मौजूद है:
Error: main class not found or loaded
यह तब होता है जब PSVM के साथ वर्ग फ़ाइल लोड नहीं की जा सकती। इसका एक संभावित कारण यह हो सकता है कि वर्ग एक इंटरफ़ेस लागू कर रहा है या किसी अन्य वर्ग का विस्तार कर रहा है जो क्लासपाथ पर नहीं है। आम तौर पर यदि कोई क्लास क्लासपथ पर नहीं है, तो फेंकी गई त्रुटि इस तरह इंगित करती है। लेकिन, यदि उपयोग में आने वाले वर्ग को विस्तारित या कार्यान्वित किया जाता है, तो जावा स्वयं कक्षा को लोड करने में असमर्थ है।
संदर्भ: https://www.computingnotes.net/java/error-main-class-not-found-or-loads/
Windows PowerShell में विज्ञापित विकल्प के java
साथ चलने पर -cp
आपको एक त्रुटि मिल सकती है जो कुछ इस तरह दिखाई देती है:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
आदेश को स्वीकार करने के लिए PowerShell के लिए, -cp
विकल्प के तर्कों को उद्धरण में शामिल किया जाना चाहिए:
java -cp 'someDependency.jar;.' ClassName
इस तरह से कमांड बनाने से जावा को क्लासपैथ तर्कों को सही तरीके से प्रोसेस करने की अनुमति मिलनी चाहिए।
Java MongoDB JDBC कनेक्शन का परीक्षण करते समय मुझे भी इसी तरह की त्रुटियों का सामना करना पड़ा। मुझे लगता है कि संक्षेप में अपने अंतिम समाधान को संक्षेप में प्रस्तुत करना अच्छा है ताकि भविष्य में कोई भी सीधे दो आज्ञाओं पर गौर कर सके और आगे बढ़ना अच्छा हो।
मान लें कि आप उस निर्देशिका में हैं जहां आपकी जावा फ़ाइल और बाहरी निर्भरता (JAR फाइलें) मौजूद हैं।
संकलित करें:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Daud:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnection
का कोई पैकेज नहीं है, और 2) आप निर्देशिका नहीं बदलते हैं। यह कहना है, कम से कम, नाजुक। और मुद्दों की व्याख्या न करके, यह उन परिस्थितियों में इस दृष्टिकोण की कोशिश करने के लिए newbies का नेतृत्व करेगा जहां यह काम नहीं करेगा । संक्षेप में, यह "वूडू प्रोग्रामिंग तकनीकों" को प्रोत्साहित करता है: en.wikipedia.org/wiki/Voodoo_programming
ठीक है, पहले से ही कई जवाब हैं, लेकिन किसी ने भी उस मामले का उल्लेख नहीं किया जहां फ़ाइल की अनुमति अपराधी हो सकती है।
चलाते समय, उपयोगकर्ता के पास JAR फ़ाइल या पथ के किसी एक निर्देशिका तक पहुँच नहीं हो सकती है। उदाहरण के लिए, विचार करें:
जार फ़ाइल में /dir1/dir2/dir3/myjar.jar
उपयोगकर्ता 1 जो JAR फ़ाइल का मालिक है:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
लेकिन यह अभी भी काम नहीं करता है:
# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
ऐसा इसलिए है क्योंकि चल रहे उपयोगकर्ता (User2) की पहुंच dir1, dir2, या javalibs याir3 तक नहीं है। जब उपयोगकर्ता 1 फ़ाइलों को देख सकता है, तो वह किसी नट को ड्राइव कर सकता है, और उन तक पहुंच सकता है, लेकिन त्रुटि अभी भी उपयोगकर्ता 2 के लिए होती है।
mvn eclipse:eclipse
यह करने के बाद मुझे यह त्रुटि मिली, इसने मेरी .classpath
फ़ाइल को थोड़ा गड़बड़ कर दिया ।
में लाइनों बदलना पड़ा .classpath
से
<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
सेवा
<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
मैं यहां बताए गए समाधानों के साथ इस समस्या को हल करने में असमर्थ था (हालांकि उत्तर में कहा गया है, कोई संदेह नहीं है, मेरी अवधारणाओं को साफ कर दिया है)। मुझे दो बार इस समस्या का सामना करना पड़ा और हर बार मैंने अलग-अलग समाधान (ग्रहण आईडीई में) की कोशिश की।
main
अपनी परियोजना के विभिन्न वर्गों में कई तरीकों के साथ आया हूं। इसलिए, मैंने main
बाद की कक्षाओं से विधि को हटा दिया था ।main
तरीके समस्या को ठीक नहीं करेंगे। एक आवेदन के साथ तकनीकी रूप से कुछ भी गलत नहीं है जिसमें कई प्रवेश बिंदु हैं।