একটি নতুন সমস্যা যা নতুন জাভা বিকাশকারীদের অভিজ্ঞতা হ'ল তাদের প্রোগ্রামগুলি ত্রুটি বার্তার সাথে চালাতে ব্যর্থ হয়: 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>একটি সম্পূর্ণরূপে যোগ্যতাসম্পন্ন Java শ্রেণি নাম, এবং <arg>একটি অবাধ কমান্ড লাইন আর্গুমেন্ট আপনার আবেদন প্রেরণ করা পরার করে।
1 - আরও কিছু বাক্য গঠন রয়েছে যা এই উত্তরের শেষের নিকটে বর্ণিত হয়েছে।
ক্লাসের জন্য সম্পূর্ণ যোগ্যতাসম্পন্ন নাম (এফকিউএন) সাধারণত জাভা উত্স কোডে যেমন লেখা থাকে; যেমন
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কমান্ডটি চালাবেন তখন কার্যকর হয় । ডিরেক্টরিগুলির নাম এবং জেআর ফাইলের নামগুলি সঠিক কিনা তা পরীক্ষা করে দেখুন।javaকমান্ডটি চালাবেন তখন কার্যকর ডিরেক্টরি থেকে কার্যকর হবে directory;উইন্ডোজ এবং :অন্যগুলিতে রয়েছে you আপনি যদি আপনার প্ল্যাটফর্মের জন্য ভুল বিভাজকটি ব্যবহার করেন তবে আপনি একটি স্পষ্ট ত্রুটি বার্তা পাবেন না Instead পরিবর্তে, আপনি সেই পথে একটি অস্তিত্বহীন ফাইল বা ডিরেক্টরি পাবেন যা নিঃশব্দে উপেক্ষা করা হবে) ।)আপনি যখন ক্লাসপথে একটি ডিরেক্টরি রাখেন, এটি আদর্শভাবে যোগ্য নামের জায়গার মূলের সাথে মিল রাখে। ক্লাসগুলি সম্পূর্ণরূপে যোগ্য নামটিকে একটি নামের সাথে ম্যাপিং করে সেই মূলের নীচে ডিরেক্টরি কাঠামোতে অবস্থিত । সুতরাং উদাহরণস্বরূপ, যদি "/ usr / স্থানীয় / একমি / ক্লাস" শ্রেণীর পথে থাকে, তবে যখন JVM একটি শ্রেণীর com.acme.example.Foonসন্ধান করে, তখন এই পথের নাম সহ একটি ".ক্লাস" ফাইল সন্ধান করবে:
/usr/local/acme/classes/com/acme/example/Foon.class
আপনি যদি ক্লাসপথে "/ usr / স্থানীয় / acme / ক্লাস / com / acme / উদাহরণ" রাখেন, তবে JVM ক্লাসটি সন্ধান করতে সক্ষম হত না।
যদি আপনার ক্লাসগুলি এফকিউএন হয় com.acme.example.Foon, তবে জেভিএম "com / acme / উদাহরণ" ডিরেক্টরিতে "Foon.class" সন্ধান করবে:
যদি আপনার ডিরেক্টরি কাঠামো উপরের প্যাটার্ন অনুসারে প্যাকেজের নামকরণের সাথে মেলে না, জেভিএম আপনার শ্রেণিটি খুঁজে পাবে না।
আপনি যদি কোনও শ্রেণীর স্থান পরিবর্তন করে নতুন নামকরণের চেষ্টা করেন তবে সেটিও ব্যর্থ হবে ... তবে ব্যতিক্রম স্ট্যাকট্রেস আলাদা হবে। এরকম কিছু বলা দায়বদ্ধ:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
কারণ ক্লাস ফাইলে FQN ক্লাস লোডার যা প্রত্যাশা করে তা মেলে না।
একটি দৃ concrete় উদাহরণ দেওয়ার জন্য, মনে করুন যে:
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এবং আরও পরীক্ষা করে দেখুন।শ্রেণিপথটিতে আপনার প্রয়োগের উপর নির্ভর করে অন্যান্য (নন সিস্টেম) শ্রেণীর সমস্ত অন্তর্ভুক্ত করা দরকার। (সিস্টেমের ক্লাসগুলি স্বয়ংক্রিয়ভাবে অবস্থিত, এবং আপনাকে খুব কমই এ নিয়ে নিজেকে চিন্তিত করতে হবে)) মূল শ্রেণীর সঠিকভাবে লোড করার জন্য, জেভিএমকে খুঁজে বার করতে হবে:
(দ্রষ্টব্য: জেএলএস এবং জেভিএম স্পেসিফিকেশনগুলি কোনও জেভিএমকে "অলসভাবে" ক্লাসগুলি লোড করার সুযোগ দেয় এবং যখন কোনও ক্লাস লোডার ব্যতিক্রম ছড়িয়ে দেওয়া হয় তখন এটি প্রভাব ফেলতে পারে))
এটি মাঝে মধ্যে ঘটে যায় যে কেউ সোর্স কোড ফাইলটিকে তাদের উত্স কোড ট্রিতে ভুল ফোল্ডারে রেখে দেয় বা তারা packageঘোষণাটি ছেড়ে দেয় । আপনি যদি কোনও আইডিইতে এটি করেন, আইডিই'র সংকলক আপনাকে অবিলম্বে এটি সম্পর্কে বলবে। একইভাবে আপনি যদি একটি শালীন জাভা বিল্ড টুল ব্যবহার করেন, তাহলে সরঞ্জামটি javacএমনভাবে চলবে যা সমস্যাটি সনাক্ত করবে। তবে, আপনি যদি নিজের জাভা কোডটি হাতে করে তৈরি করেন, আপনি এটি এমনভাবে করতে পারেন যাতে সংকলকটি সমস্যাটি লক্ষ্য করে না, এবং ফলস্বরূপ ".ক্লাস" ফাইলটি আপনি যে জায়গায় প্রত্যাশা করেছেন সে স্থানে নেই।
চেক করার জন্য প্রচুর জিনিস রয়েছে এবং কোনও কিছু মিস করা সহজ। কমান্ড লাইনে -Xdiagবিকল্পটি যুক্ত করার চেষ্টা করুন java(এর পরে প্রথম জিনিস হিসাবে java)। এটি শ্রেণি লোডিং সম্পর্কিত বিভিন্ন জিনিস আউটপুট দেবে এবং এটি আসল সমস্যাটি কী তা সম্পর্কে আপনাকে ক্লুটি প্রদান করতে পারে।
এছাড়াও, ওয়েবসাইট, নথি এবং অন্যান্য থেকে অদৃশ্য বা অ-এএসসিআইআই অক্ষর অনুলিপি করে এবং আটকানোর ফলে সৃষ্ট সমস্যাগুলি বিবেচনা করুন। এবং "হোমোগ্লাইফস" বিবেচনা করুন, দুটি অক্ষর বা চিহ্নগুলি দেখতে একই রকম ছিল ... তবে তা নয়।
অবশেষে, আপনি যদি ভুল স্বাক্ষর সহ কোনও জেআর ফাইল থেকে লঞ্চ করার চেষ্টা করেন তবে আপনি স্পষ্টতই এই সমস্যাটিতে চলে যেতে পারেন (META-INF/*.SF)।
javaব্যবহার করে জাভা প্রোগ্রাম চালু করার জন্য তিনটি বিকল্প বাক্য গঠন রয়েছে java command।
1) "এক্সিকিউটেবল" জেআর ফাইল চালু করার জন্য ব্যবহৃত সিনট্যাক্সটি নিম্নরূপ:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
যেমন
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
এন্ট্রি-পয়েন্ট শ্রেণীর নাম (যেমন com.acme.example.ListUser) এবং ক্লাসপাথটি জেআর ফাইলের ম্যানিফয়েস্টে নির্দিষ্ট করা আছে।
২) মডিউল (জাভা 9 এবং তারপরে) থেকে অ্যাপ্লিকেশন চালু করার বাক্য গঠনটি নিম্নরূপ:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
এন্ট্রিপয়েন্ট শ্রেণীর নামটি হয় <module>নিজেই সংজ্ঞায়িত হয় , বা byচ্ছিক দ্বারা দেওয়া হয় <mainclass>।
3) জাভা 11 থেকে, আপনি একটি একক উত্স কোড ফাইলটি সংকলন করতে এবং চালাতে এবং নিম্নলিখিত সিনট্যাক্সের সাথে চালাতে পারেন:
java [ <options> ] <sourcefile> [<arg> ...]
"(জাভা") প্রত্যয় সহ একটি ফাইল যেখানে (সাধারণত) থাকে।
আরও বিশদের জন্য, দয়া javaকরে জাভা প্রকাশের যে কমান্ডটি আপনি ব্যবহার করছেন তার অফিসিয়াল ডকুমেন্টেশন পড়ুন ।
একটি সাধারণ জাভা আইডিই আইডিই জেভিএম নিজে বা কোনও শিশু জেভিএম-তে জাভা অ্যাপ্লিকেশনগুলি চালনার জন্য সমর্থন করে। এগুলি এই নির্দিষ্ট ব্যতিক্রম থেকে সাধারণত অনাক্রম্য, কারণ আইডিই রানটাইম ক্লাসপাথ তৈরি করতে, প্রধান শ্রেণিটি সনাক্ত করতে এবং javaকমান্ড লাইন তৈরি করতে নিজস্ব ব্যবস্থা ব্যবহার করে ।
তবে আপনি যদি আইডিইর পিছনে কিছু করেন তবে এই ব্যতিক্রমটি ঘটানো এখনও সম্ভব। উদাহরণস্বরূপ, আপনি যদি পূর্বে ইক্লিপসে আপনার জাভা অ্যাপ্লিকেশনটির জন্য একটি অ্যাপ্লিকেশন লঞ্চার সেটআপ করে রেখেছিলেন এবং তারপরে আপনি "মুখ্য" শ্রেণি সমন্বিত জেআর ফাইলটিকে গ্রহনকে না বলেই ফাইল সিস্টেমের একটি পৃথক স্থানে সরিয়ে নিয়েছেন , তবে ग्रहण অজান্তেই JVM আরম্ভ করবে একটি ভুল ক্লাসপথ সহ।
সংক্ষেপে, আপনি যদি কোনও আইডিইতে সমস্যাটি পান তবে বাসি আইডিই অবস্থা, ভাঙা প্রকল্পের রেফারেন্স বা ভাঙা লঞ্চার কনফিগারেশনগুলির মতো জিনিসগুলি পরীক্ষা করুন।
কোনও আইডিইর পক্ষে কেবল বিভ্রান্ত হওয়াও সম্ভব। আইডিই হ'ল বিবিধ জটিল সফটওয়্যারটির টুকরো যা অনেকগুলি ইন্টারঅ্যাক্টিং অংশ নিয়ে গঠিত। আইডিই সম্পূর্ণ প্রতিক্রিয়াশীল করার জন্য এই অংশগুলির অনেকগুলি বিভিন্ন ক্যাচিং কৌশল অবলম্বন করে। এগুলি কখনও কখনও ভুল হতে পারে এবং অ্যাপ্লিকেশনগুলি চালু করার সময় একটি সম্ভাব্য লক্ষণ হ'ল সমস্যা। যদি আপনি সন্দেহ করেন যে এটি ঘটতে পারে তবে এটি আপনার আইডিই পুনরায় চালু করা, প্রকল্পটি পুনর্নির্মাণ এবং আরও অনেক কিছুর জন্য চেষ্টা করার মতো।
java -cp ../third-party-library.jar com.my.package.MyClass; এটি কাজ করে না, পরিবর্তে স্থানীয় ফোল্ডারটি বর্গ :java -cp ../third-party-library.jar:. com.my.package.MyClass
javaএটি বলে না যে এটি কোনও আমদানিকৃত শ্রেণি খুঁজে পায় না, পরিবর্তে আপনি চালানোর চেষ্টা করছেন এমন প্রধান শ্রেণি। এটি বিভ্রান্তিকর, যদিও আমি নিশ্চিত যে এর কারণ আছে। আমার কেসটি ছিল javaযেখানে আমার ক্লাসটি ঠিক কোথায় ছিল তা জানা ছিল , তবে এটি আমদানীকৃত ক্লাসগুলির মধ্যে একটিও খুঁজে পেল না। এটি বলার পরিবর্তে, এটি আমার প্রধান শ্রেণীর সন্ধান না করার বিষয়ে অভিযোগ করেছিল। সত্যিই, বিরক্তিকর।
যদি আপনার উত্স কোডের নাম হ্যালোওয়ার্ল্ড.জভা হয় তবে আপনার সংকলিত কোডটি হবে HelloWorld.class।
আপনি যদি এটি ব্যবহার করে কল করেন তবে আপনি এই ত্রুটিটি পাবেন:
java HelloWorld.class
পরিবর্তে, এটি ব্যবহার করুন:
java HelloWorld
javac TestCode.javaএরপরেjava TestCode
java -classpath . HelloWorld
যদি আপনার ক্লাসগুলি প্যাকেজগুলিতে থাকে তবে আপনাকে cdআপনার প্রকল্পের মূল ডিরেক্টরিতে যেতে হবে এবং শ্রেণীর পুরোপুরি যোগ্যতাসম্পন্ন নাম (প্যাকেজনাম.মেনক্লাসনেম) ব্যবহার করে চালাতে হবে।
উদাহরণ:
আমার ক্লাস এখানে আছে:
D:\project\com\cse\
আমার মূল শ্রেণীর পুরোপুরি যোগ্য নাম:
com.cse.Main
সুতরাং আমি cdমূল প্রকল্প ডিরেক্টরিতে ফিরে যাচ্ছি :
D:\project
তারপরে javaকমান্ডটি জারি করুন :
java com.cse.Main
এই উত্তরটি কোনও সাধারণ ভুলের কারণে হতাশার হাত থেকে নবাগত জাভা প্রোগ্রামারদের উদ্ধার করার জন্য, আমি আপনাকে জাভা ক্লাসপাথ সম্পর্কে গভীরতর জ্ঞানের জন্য গৃহীত উত্তরটি পড়ার পরামর্শ দিই।
আপনি যদি একটিতে প্রধান শ্রেণি এবং প্রধান পদ্ধতিটি সংজ্ঞায়িত করেন তবে শ্রেণীরpackage পুরো নাম ব্যবহার করে ( packageName.MainClassName) এটি আপনার শ্রেণিবদ্ধ ডিরেক্টরিতে চালানো উচিত ।
ধরুন এখানে একটি সোর্স কোড ফাইল রয়েছে (মেইন.জাভা):
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এতে নিম্নলিখিত ক্লাসের সাথে টেম্প.জভা ফাইল তৈরি করুন :
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}ফোল্ডারে একটি কমান্ড লাইন খুলুন C:\temp, এবং টেম্প ক্লাসটি সংকলন করতে নিম্নলিখিত কমান্ডটি লিখুন:
javac Temp.javaসংকলিত জাভা ক্লাস চালাও, জেআরই কে ক্লাসটি -classpathকোথায় পাবেন তা জানাতে বিকল্প যুক্ত করে :
java -classpath C:\temp Temp Hello!javaক্লাসপাথের দিকে তাকিয়ে ছিল না (কারণ আপনি ক্লাসপাথ বা-জাজার ব্যবহার করেছেন) বা ২) ক্লাসপাথ সেটিংটি সেই পরিবেশে সেট করা হয়নি যা সেই প্রসঙ্গে কার্যকর ছিল না javawas চালানো; উদাহরণস্বরূপ কারণ আপনি ফাইলটি "উত্স" করেন নি যেখানে ডান শেলটিতে setenv কমান্ড যুক্ত হয়েছে।
ত্রুটির বার্তা অনুযায়ী ("প্রধান শ্রেণীর সন্ধান বা লোড করা যায়নি"), দুটি ধরণের সমস্যা রয়েছে:
প্রধান বর্গ করা যায়নি পাওয়া যখন সেখানে সম্পূর্ণরূপে যোগ্যতাসম্পন্ন বর্গ নামে টাইপো ভুল বা বাক্য গঠন বা এটি প্রদান করা ক্লাসপাথ বিদ্যমান নেই ।
প্রধান বর্গ যায়নি লোড যখন বর্গ প্রবর্তিত করা যাবে না , সাধারণত প্রধান বর্গ অন্য বর্গ প্রসারিত এবং যে বর্গ প্রদত্ত ক্লাসপাথ মধ্যে বিদ্যমান নেই।
উদাহরণ স্বরূপ:
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
MainJAR ফাইলটিতে নেই। -cp lib.jar;একই জিনিস যেমন মানে -cp lib.jar;. অর্থাত বর্তমান ডিরেক্টরী ক্লাসপাথ উপর অন্তর্ভুক্ত করা হয়।
এক্সএডিয়াগ চেষ্টা করুন ।
স্টিভ সি এর উত্তর সম্ভাব্য কেসগুলি সুন্দরভাবে কভার করে, তবে কখনও কখনও নির্ধারণ করা যে ক্লাসটি পাওয়া যায় না বা বোঝা যায়নি তা সহজ নয়। ব্যবহার করুন java -Xdiag(জেডিকে 7 সাল থেকে)। এটি একটি দুর্দান্ত স্ট্যাকট্রেস প্রিন্ট করে যা বার্তা Could not find or load main classবার্তার অর্থ কী তা বোঝার জন্য একটি ইঙ্গিত সরবরাহ করে ।
উদাহরণস্বরূপ, এটি আপনাকে প্রধান শ্রেণীর দ্বারা ব্যবহৃত অন্যান্য শ্রেণীর দিকে নির্দেশ করতে পারে যা খুঁজে পাওয়া যায়নি এবং প্রধান শ্রেণীর বোঝা লোড হতে বাধা দেয়।
এই আদেশটি ব্যবহার করুন:
java -cp . [PACKAGE.]CLASSNAME
উদাহরণ: যদি আপনার ক্লাসের নাম হ্যালো.জাভা থেকে হ্যালো.ক্লাস তৈরি করা হয় তবে নীচের আদেশটি ব্যবহার করুন:
java -cp . Hello
যদি আপনার ফাইল হ্যালো.জাভা প্যাকেজ com.demo এর ভিতরে থাকে তবে নীচের কমান্ডটি ব্যবহার করুন
java -cp . com.demo.Hello
জেডিকে 8 এর সাথে অনেক সময় এমন হয় যে ক্লাস ফাইলটি একই ফোল্ডারে উপস্থিত থাকে তবে javaকমান্ডটি ক্লাসপাথের প্রত্যাশা করে এবং এই কারণে আমরা -cp .বর্তমান ফোল্ডারটিকে ক্লাসপথের রেফারেন্স হিসাবে গ্রহণ করি।
-cp .অপ্রয়োজনীয়, কারণ যদি $CLASSPATHসেট না করে থাকে তবে .তা ডিফল্ট শ্রেণিবদ্ধ।
echo %CLASSPATH%আউটপুট কী করে ?) এবং না, আমি চেক করতে পারি না কারণ আমার উইন্ডোজ পিসি নেই।
কখনও কখনও যে কারণে সমস্যার কারণ হতে পারে তার মূল শ্রেণীর সাথে কোনও সম্পর্ক নেই এবং আমাকে এটিকে কঠিন উপায় খুঁজে বের করতে হয়েছিল। এটি একটি রেফারেন্সড লাইব্রেরি ছিল যা আমি সরে গিয়েছিলাম এবং এটি আমাকে দিয়েছে:
প্রধান শ্রেণীর xxx লিনাক্স খুঁজে পাওয়া বা লোড করা যায় নি Could
আমি কেবলমাত্র সেই উল্লেখটি মুছলাম, আবার যুক্ত করেছি এবং এটি আবার ঠিকঠাক কাজ করেছে।
এই উদাহরণে আপনার কাছে রয়েছে:
মেইন ক্লাস ? ক্লাসপাথ খুঁজে পাওয়া বা লোড করা যায় নি ?
এটি কারণ আপনি "-ক্লাসপাথ" ব্যবহার করছেন তবে ড্যাশ 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ক্লাসপথে একটি ফোল্ডারও অন্তর্ভুক্ত করা হবে।
/*প্রয়োজনীয়?
শ্রেণীর ফাইলের অবস্থান: সি: \ পরীক্ষা \ কম \ সংস্থা
ফাইলের নাম: মেইন.ক্লাস
সম্পূর্ণরূপে যোগ্য শ্রেণীর নাম: com.company.Main
কমান্ড লাইন কমান্ড:
java -classpath "C:\test" com.company.Main
এখানে নোট করুন যে শ্রেণীর পথে \ com \ সংস্থার অন্তর্ভুক্ত নেই
এই সমস্যাটি সমাধানের চেষ্টা করার জন্য আমি একটি শালীন সময় ব্যয় করেছি। আমি ভেবেছিলাম যে আমি কোনওভাবে আমার ক্লাসপথটি ভুলভাবে সেট করে দিচ্ছি তবে সমস্যাটি ছিল আমি টাইপ করেছি:
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:" টাইপ করুন এবং "সিডি (ফোল্ডারের নাম)" টাইপ করুন।
if "cd" helps then it by luck rather than by judgement। এটি ভুল (আমার বিশ্বাস), যেমন জাভা বর্তমান ডিরেক্টরিটি .ডিফল্টরূপে ক্লাসপথের অংশ হিসাবে ব্যবহার করে ।
আমার ক্ষেত্রে সমস্যাটি কী ঠিক করেছিল তা হ'ল:
আপনি যে প্রকল্প / শ্রেণিতে চালাতে চান তার উপর ডান ক্লিক করুন, তারপরে Run As-> Run Configurations। তারপরে আপনার হয় হয় আপনার বিদ্যমান কনফিগারেশনটি ঠিক করা বা নিম্নলিখিত উপায়ে নতুন যুক্ত করা উচিত:
খোলা Classpath ট্যাব এ ক্লিক করুন Advanced...তারপর বাটন যোগ binফোল্ডারের আপনার প্রকল্পের।
আপনি যদি জেআর ফাইলটি তৈরি করতে মাভেন ব্যবহার করেন তবে দয়া করে 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%;.। আপনার সিএমডি উইন্ডোটি যতক্ষণ না খোলা থাকবে ততক্ষণ এটি স্থায়ী থাকবে।
আপনার 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এসআরসি ফোল্ডারে যাওয়া উচিত এবং আপনার যে কমান্ডটি চালাতে হবে তা দেখতে এই রকম হবে:
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-loaded/
যখন চলমান javaসঙ্গে -cpউইন্ডোজ PowerShell মধ্যে বিজ্ঞাপনে যেমন বিকল্পটি কোনো ত্রুটির সম্মুখীন হয়েছেন পারে যে কেমন লাগে কিছু:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
পাওয়ারশেলের কমান্ডটি গ্রহণ করার জন্য, -cpবিকল্পের আর্গুমেন্টগুলি অবশ্যই উদ্ধৃতিতে অন্তর্ভুক্ত থাকতে হবে:
java -cp 'someDependency.jar;.' ClassName
এইভাবে কমান্ডটি গঠনের মাধ্যমে জাভা ক্লাসপাথ আর্গুমেন্টগুলি সঠিকভাবে প্রক্রিয়াকরণ করা উচিত।
জাভা মঙ্গোডিবি জেডিবিসি সংযোগ পরীক্ষা করার সময় আমিও একই ধরণের ত্রুটির মুখোমুখি হয়েছি। আমি মনে করি আমার চূড়ান্ত সমাধানটি সংক্ষেপে সংক্ষেপে বলা ভাল যাতে ভবিষ্যতে যে কেউ সরাসরি দুটি আদেশের সন্ধান করতে পারে এবং আরও এগিয়ে যাওয়ার পক্ষে ভাল।
ধরে নিন আপনি যে ডিরেক্টরিতে আপনার জাভা ফাইল এবং বাহ্যিক নির্ভরতা (জেআর ফাইল) বিদ্যমান রয়েছে।
কম্পাইল:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
চালান:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnectionএর কোনও প্যাকেজ নেই এবং 2) আপনি ডিরেক্টরি পরিবর্তন করেন না। এটি হ'ল কমপক্ষে, ভঙ্গুর। এবং বিষয় ব্যাখ্যা না করে, এটা নতুনদের নেতৃত্ব এই পদ্ধতির চেষ্টা করবে যেখানে এটি কাজ করবে না পরিস্থিতিতে । সংক্ষেপে, এটি "ভুডো প্রোগ্রামিং কৌশলগুলি" উত্সাহ দেয়: এন.ইউইউইকিপিডিয়া.আর
ঠিক আছে, ইতিমধ্যে অনেক উত্তর রয়েছে, তবে কেউই সেই মামলার উল্লেখ করেনি যেখানে ফাইল অনুমতিগুলি অপরাধী হতে পারে।
চলমান অবস্থায়, কোনও ব্যবহারকারীর জেআর ফাইল বা পথের ডিরেক্টরিগুলির একটিতে অ্যাক্সেস নাও থাকতে পারে। উদাহরণস্বরূপ, বিবেচনা করুন:
জার ফাইল ভিতরে /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
এটি কারণ চলমান ব্যবহারকারীর (ব্যবহারকারীর) dir1, dir2, বা জাভালিব বা dir3 এর অ্যাক্সেস নেই। ব্যবহারকারী 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পদ্ধতিগুলি মোছা সমস্যার সমাধান করবে না। একাধিক এন্ট্রি পয়েন্ট রয়েছে এমন কোনও অ্যাপ্লিকেশনটিতে প্রযুক্তিগতভাবে কোনও ভুল নেই।