"প্রধান শ্রেণীর সন্ধান বা লোড করা যায়নি" এর অর্থ কী?


1369

একটি নতুন সমস্যা যা নতুন জাভা বিকাশকারীদের অভিজ্ঞতা হ'ল তাদের প্রোগ্রামগুলি ত্রুটি বার্তার সাথে চালাতে ব্যর্থ হয়: Could not find or load main class ...

এর অর্থ কী, এর কারণ কী এবং আপনার এটি কীভাবে ঠিক করা উচিত?


37
দয়া করে নোট করুন যে এটি একটি "স্ব-উত্তর" প্রশ্ন যা নতুন জাভা ব্যবহারকারীদের জন্য জেনেরিক রেফারেন্স প্রশ্নোত্তর হিসাবে তৈরি করা হয়েছে। আমি কোনও বিদ্যমান প্রশ্নোত্তর খুঁজে পাইনি যা এটিকে পর্যাপ্ত পরিমাণে (আইএমও) কভার করে।
স্টিফেন সি

উত্তর:


1227

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নিচের কাজগুলো করতে কমান্ড প্রয়োগ করুন:

  1. com.acme.example.ListUsersক্লাসের সংকলিত সংস্করণটি অনুসন্ধান করুন ।
  2. ক্লাস লোড করুন।
  3. স্বাক্ষর , রিটার্ন টাইপ এবং প্রদত্ত সংশোধকmain সহ শ্রেণীর একটি পদ্ধতি রয়েছে তা পরীক্ষা করুন । (দ্রষ্টব্য, পদ্ধতির যুক্তির নাম স্বাক্ষরের অংশ নয় ।)public static void main(String[])
  4. কমান্ড লাইন আর্গুমেন্ট ("ফ্রেড", "জো", "বার্ট") পাস করে সেই পদ্ধতিটিকে এটিকে বলুন String[]

জাভা কেন ক্লাস খুঁজে পাচ্ছে না তার কারণগুলি

যখন আপনি "প্রধান শ্রেণীর সন্ধান বা লোড করতে পারা যায় না" বার্তাটি পান, তার অর্থ প্রথম পদক্ষেপ ব্যর্থ হয়েছে। javaকমান্ড বর্গ খুঁজে পেতে সক্ষম ছিল না। এবং প্রকৃতপক্ষে, বার্তায় "..." হ'ল সম্পূর্ণ যোগ্য শ্রেণীর নাম যা সন্ধান javaকরছে।

তাহলে কেন এটি ক্লাসটি সন্ধান করতে অক্ষম হতে পারে?

কারণ # 1 - আপনি শ্রেণিকাম যুক্তি দিয়ে ভুল করেছেন

প্রথম সম্ভাব্য কারণটি হ'ল আপনি ভুল শ্রেণীর নাম সরবরাহ করতে পারেন। (বা ... সঠিক শ্রেণীর নাম, তবে ভুল আকারে)) উপরের উদাহরণ বিবেচনা করে, এখানে শ্রেণীর নাম নির্দিষ্ট করার জন্য বিভিন্ন ভুল উপায় রয়েছে :

  • উদাহরণ # 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

কারণ # 2 - আবেদনের ক্লাসপথটি ভুলভাবে নির্দিষ্ট করা হয়েছে

দ্বিতীয় সম্ভাব্য কারণটি হ'ল শ্রেণীর নামটি সঠিক, তবে javaআদেশটি ক্লাসটি খুঁজে পাচ্ছে না। এটি বুঝতে আপনার "ক্লাসপথ" ধারণাটি বুঝতে হবে। এটি ওরাকল ডকুমেন্টেশন দ্বারা ভালভাবে ব্যাখ্যা করা হয়েছে :

সুতরাং ... আপনি যদি ক্লাসের নামটি সঠিকভাবে নির্দিষ্ট করে থাকেন তবে পরের জিনিসটি পরীক্ষা করে আপনি ক্লাসপথটি সঠিকভাবে নির্দিষ্ট করেছেন:

  1. উপরে লিঙ্কিত তিনটি নথি পড়ুন। (হ্যাঁ ... সেগুলি পড়ুন! একটি জাভা প্রোগ্রামার জাভা ক্লাসপাথ প্রক্রিয়াগুলি কীভাবে কাজ করে তার কমপক্ষে বেসিকগুলি বুঝতে হবে তা গুরুত্বপূর্ণ ))
  2. কমান্ড লাইন এবং / অথবা CLASSPATH এনভায়রনমেন্ট ভেরিয়েবলটি দেখুন যখন আপনি javaকমান্ডটি চালাবেন তখন কার্যকর হয় । ডিরেক্টরিগুলির নাম এবং জেআর ফাইলের নামগুলি সঠিক কিনা তা পরীক্ষা করে দেখুন।
  3. ক্লাসপথে যদি কোনও আপেক্ষিক পথের নাম থাকে তবে পরীক্ষা করুন যে তারা সঠিকভাবে সমাধান করেছে ... আপনি যখন javaকমান্ডটি চালাবেন তখন কার্যকর ডিরেক্টরি থেকে কার্যকর হবে directory
  4. পরীক্ষা করুন যে ক্লাসটি (ত্রুটি বার্তায় উল্লিখিত) কার্যকর ক্লাসপাথের উপরে অবস্থিত হতে পারে ।
  5. নোট করুন যে উইন্ডোজ বনাম লিনাক্স এবং ম্যাক ওএসের জন্য শ্রেণিপথ সিনট্যাক্স আলাদা । (ক্লাসপথ বিভাজকটি ;উইন্ডোজ এবং :অন্যগুলিতে রয়েছে you আপনি যদি আপনার প্ল্যাটফর্মের জন্য ভুল বিভাজকটি ব্যবহার করেন তবে আপনি একটি স্পষ্ট ত্রুটি বার্তা পাবেন না Instead পরিবর্তে, আপনি সেই পথে একটি অস্তিত্বহীন ফাইল বা ডিরেক্টরি পাবেন যা নিঃশব্দে উপেক্ষা করা হবে) ।)

কারণ # 2 এ - ভুল ডিরেক্টরিটি ক্লাসপথে রয়েছে

আপনি যখন ক্লাসপথে একটি ডিরেক্টরি রাখেন, এটি আদর্শভাবে যোগ্য নামের জায়গার মূলের সাথে মিল রাখে। ক্লাসগুলি সম্পূর্ণরূপে যোগ্য নামটিকে একটি নামের সাথে ম্যাপিং করে সেই মূলের নীচে ডিরেক্টরি কাঠামোতে অবস্থিত । সুতরাং উদাহরণস্বরূপ, যদি "/ usr / স্থানীয় / একমি / ক্লাস" শ্রেণীর পথে থাকে, তবে যখন JVM একটি শ্রেণীর com.acme.example.Foonসন্ধান করে, তখন এই পথের নাম সহ একটি ".ক্লাস" ফাইল সন্ধান করবে:

  /usr/local/acme/classes/com/acme/example/Foon.class

আপনি যদি ক্লাসপথে "/ usr / স্থানীয় / acme / ক্লাস / com / acme / উদাহরণ" রাখেন, তবে JVM ক্লাসটি সন্ধান করতে সক্ষম হত না।

কারণ # 2 বি - উপ-ডিরেক্টরি পাথ FQN এর সাথে মেলে না

যদি আপনার ক্লাসগুলি এফকিউএন হয় 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এবং আরও পরীক্ষা করে দেখুন।
  • ক্লাসপথগুলিতে পরম এবং আপেক্ষিক পথের নামগুলির মধ্যে নির্বাচন করার সময় সাবধানতার সাথে চিন্তা করুন। মনে রাখবেন যে বর্তমান ডিরেক্টরি পরিবর্তন হলে কোনও আপেক্ষিক পথের নাম "ব্রেক" হতে পারে।

কারণ # 2 সি - শ্রেণিপথ থেকে নির্ভরতা অনুপস্থিত

শ্রেণিপথটিতে আপনার প্রয়োগের উপর নির্ভর করে অন্যান্য (নন সিস্টেম) শ্রেণীর সমস্ত অন্তর্ভুক্ত করা দরকার। (সিস্টেমের ক্লাসগুলি স্বয়ংক্রিয়ভাবে অবস্থিত, এবং আপনাকে খুব কমই এ নিয়ে নিজেকে চিন্তিত করতে হবে)) মূল শ্রেণীর সঠিকভাবে লোড করার জন্য, জেভিএমকে খুঁজে বার করতে হবে:

(দ্রষ্টব্য: জেএলএস এবং জেভিএম স্পেসিফিকেশনগুলি কোনও জেভিএমকে "অলসভাবে" ক্লাসগুলি লোড করার সুযোগ দেয় এবং যখন কোনও ক্লাস লোডার ব্যতিক্রম ছড়িয়ে দেওয়া হয় তখন এটি প্রভাব ফেলতে পারে))

কারণ # 3 - ক্লাসটি ভুল প্যাকেজে ঘোষণা করা হয়েছে

এটি মাঝে মধ্যে ঘটে যায় যে কেউ সোর্স কোড ফাইলটিকে তাদের উত্স কোড ট্রিতে ভুল ফোল্ডারে রেখে দেয় বা তারা 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করে জাভা প্রকাশের যে কমান্ডটি আপনি ব্যবহার করছেন তার অফিসিয়াল ডকুমেন্টেশন পড়ুন ।


IDEs

একটি সাধারণ জাভা আইডিই আইডিই জেভিএম নিজে বা কোনও শিশু জেভিএম-তে জাভা অ্যাপ্লিকেশনগুলি চালনার জন্য সমর্থন করে। এগুলি এই নির্দিষ্ট ব্যতিক্রম থেকে সাধারণত অনাক্রম্য, কারণ আইডিই রানটাইম ক্লাসপাথ তৈরি করতে, প্রধান শ্রেণিটি সনাক্ত করতে এবং javaকমান্ড লাইন তৈরি করতে নিজস্ব ব্যবস্থা ব্যবহার করে ।

তবে আপনি যদি আইডিইর পিছনে কিছু করেন তবে এই ব্যতিক্রমটি ঘটানো এখনও সম্ভব। উদাহরণস্বরূপ, আপনি যদি পূর্বে ইক্লিপসে আপনার জাভা অ্যাপ্লিকেশনটির জন্য একটি অ্যাপ্লিকেশন লঞ্চার সেটআপ করে রেখেছিলেন এবং তারপরে আপনি "মুখ্য" শ্রেণি সমন্বিত জেআর ফাইলটিকে গ্রহনকে না বলেই ফাইল সিস্টেমের একটি পৃথক স্থানে সরিয়ে নিয়েছেন , তবে ग्रहण অজান্তেই JVM আরম্ভ করবে একটি ভুল ক্লাসপথ সহ।

সংক্ষেপে, আপনি যদি কোনও আইডিইতে সমস্যাটি পান তবে বাসি আইডিই অবস্থা, ভাঙা প্রকল্পের রেফারেন্স বা ভাঙা লঞ্চার কনফিগারেশনগুলির মতো জিনিসগুলি পরীক্ষা করুন।

কোনও আইডিইর পক্ষে কেবল বিভ্রান্ত হওয়াও সম্ভব। আইডিই হ'ল বিবিধ জটিল সফটওয়্যারটির টুকরো যা অনেকগুলি ইন্টারঅ্যাক্টিং অংশ নিয়ে গঠিত। আইডিই সম্পূর্ণ প্রতিক্রিয়াশীল করার জন্য এই অংশগুলির অনেকগুলি বিভিন্ন ক্যাচিং কৌশল অবলম্বন করে। এগুলি কখনও কখনও ভুল হতে পারে এবং অ্যাপ্লিকেশনগুলি চালু করার সময় একটি সম্ভাব্য লক্ষণ হ'ল সমস্যা। যদি আপনি সন্দেহ করেন যে এটি ঘটতে পারে তবে এটি আপনার আইডিই পুনরায় চালু করা, প্রকল্পটি পুনর্নির্মাণ এবং আরও অনেক কিছুর জন্য চেষ্টা করার মতো।


অন্যান্য তথ্যসূত্র


43
আমি যখন তৃতীয় পক্ষের লাইব্রেরি সহ একটি ক্লাস চালানোর চেষ্টা করছিলাম তখন আমার এই সমস্যা হয়েছিল। আমি ভালো জাভা আহ্বান করেছে: java -cp ../third-party-library.jar com.my.package.MyClass; এটি কাজ করে না, পরিবর্তে স্থানীয় ফোল্ডারটি বর্গ :java -cp ../third-party-library.jar:. com.my.package.MyClass
পথেও যুক্ত করা প্রয়োজন

22
জাভা প্রোগ্রামিং বছর পরে আমি এখনও এই পৃষ্ঠায় শেষ করতে পরিচালিত। আমার জন্য বিষয়টি ছিল ক্লাসপথ সিনট্যাক্সটি ওএস-নির্ভর । আমি উইন্ডোজ প্রোগ্রামিং এ এক ধরনের নতুন এবং কোন ধারণা ছিল না।
কীজার

5
অতিরিক্ত নোট, পয়েন্ট 2 আমাকে বাঁচাতে! এটি দেখে দুঃখ হয় যে javaএটি বলে না যে এটি কোনও আমদানিকৃত শ্রেণি খুঁজে পায় না, পরিবর্তে আপনি চালানোর চেষ্টা করছেন এমন প্রধান শ্রেণি। এটি বিভ্রান্তিকর, যদিও আমি নিশ্চিত যে এর কারণ আছে। আমার কেসটি ছিল javaযেখানে আমার ক্লাসটি ঠিক কোথায় ছিল তা জানা ছিল , তবে এটি আমদানীকৃত ক্লাসগুলির মধ্যে একটিও খুঁজে পেল না। এটি বলার পরিবর্তে, এটি আমার প্রধান শ্রেণীর সন্ধান না করার বিষয়ে অভিযোগ করেছিল। সত্যিই, বিরক্তিকর।
এমএসএক্স

অ্যালিপসে আমার দু'বার সমস্যা হয়েছিল। প্রথমবারের মেইন () এর স্বাক্ষরটি ভুল ছিল। দ্বিতীয়বার আমি একটি .জার নামকরণ করেছি, এবং যদিও আমি নতুনটি নির্মাণের পথে যুক্ত করেছি, তবে এক্সলিপটি পুরানোটি খুঁজে পায়নি, তাই এই ত্রুটিটি সহ প্রকল্পটি সংকলন হয়নি। আমি প্রকল্প> সম্পত্তি> জাভা বিল্ড পাথ> গ্রন্থাগারগুলি থেকে .jar ফাইলটি সরিয়ে ফেলতে হয়েছিল।
গ্রেগটি

আমি তৃতীয়বার এটির মুখোমুখি হয়েছি। আমি একটি উইন্ডোজ 10 ব্যাচের ফাইল থেকে প্রোগ্রামটি চালিয়েছি এবং .jar নামটি একটি ভেরিয়েবলের মধ্যে রেখেছি ("-cp% jarname%; lib *" দিয়ে ডাকা হয়)। আমি ভুল করে জার্নামের শেষে একটি অতিরিক্ত জায়গা রেখেছি এবং এটি ত্রুটির কারণ হয়েছিল। হ্যাট ট্রিক :)
গ্রেগট

239

যদি আপনার উত্স কোডের নাম হ্যালোওয়ার্ল্ড.জভা হয় তবে আপনার সংকলিত কোডটি হবে HelloWorld.class

আপনি যদি এটি ব্যবহার করে কল করেন তবে আপনি এই ত্রুটিটি পাবেন:

java HelloWorld.class

পরিবর্তে, এটি ব্যবহার করুন:

java HelloWorld

3
সমস্যাটি হ'ল এই সমাধানটি কোনও JAR ফাইলের নির্ভরতা ছাড়াই ডিফল্ট প্যাকেজে ঘোষিত জাভা ক্লাসগুলির জন্য কাজ করে। (এবং তারপরেও, সমস্ত সময় নয়)) বেশিরভাগ জাভা প্রোগ্রামগুলি এত সহজ নয়।
স্টিফেন সি

1
স্টিফেন বলেছিলেন, এটি কেবলমাত্র "ডিফল্ট প্যাকেজ" নিয়ে কাজ করে - যার অর্থ ফাইলের শীর্ষে কোনও প্যাকেজ ঘোষণা নেই । কিছু কোডের তাত্ক্ষণিক পরীক্ষার জন্য, আমি করেছি: javac TestCode.javaএরপরেjava TestCode
কেউ কোথাও

এটি আমার পক্ষে কার্যকর হয়নি। এটি এখনও বলে, "প্রধান শ্রেণীর হ্যালো ওয়ার্ল্ড খুঁজে পাওয়া বা লোড করা যায়নি"
জিম

java -jar হ্যালো ওয়ার্ল্ড.জার এছাড়াও একটি বিকল্প
BMaximus

12
আমার যা করা দরকারjava -classpath . HelloWorld
ক্রিস প্রিন্স

136

যদি আপনার ক্লাসগুলি প্যাকেজগুলিতে থাকে তবে আপনাকে cdআপনার প্রকল্পের মূল ডিরেক্টরিতে যেতে হবে এবং শ্রেণীর পুরোপুরি যোগ্যতাসম্পন্ন নাম (প্যাকেজনাম.মেনক্লাসনেম) ব্যবহার করে চালাতে হবে।

উদাহরণ:

আমার ক্লাস এখানে আছে:

D:\project\com\cse\

আমার মূল শ্রেণীর পুরোপুরি যোগ্য নাম:

com.cse.Main

সুতরাং আমি cdমূল প্রকল্প ডিরেক্টরিতে ফিরে যাচ্ছি :

D:\project

তারপরে javaকমান্ডটি জারি করুন :

java com.cse.Main

এই উত্তরটি কোনও সাধারণ ভুলের কারণে হতাশার হাত থেকে নবাগত জাভা প্রোগ্রামারদের উদ্ধার করার জন্য, আমি আপনাকে জাভা ক্লাসপাথ সম্পর্কে গভীরতর জ্ঞানের জন্য গৃহীত উত্তরটি পড়ার পরামর্শ দিই।


2
এই উত্তরটি অনুমানের পুরো বোঝা তৈরি করে। এবং এটি অর্জনের অন্যান্য উপায়ও রয়েছে। উপরের পরামর্শগুলি অন্ধভাবে অনুসরণ না করে, আমি সুপারিশ করব যে লোকেরা আমার উত্তরের লিঙ্কগুলি পড়তে সময় দেবে যা জাভা ক্লাসপাথ কীভাবে কাজ করে তা ব্যাখ্যা করে। আপনি যা করছেন তা বোঝার চেয়ে এটি আরও ভাল ...
স্টিফেন সি

2
এই উত্তরটি আমার যে সঠিক অনুমানের প্রয়োজন তা করে তোলে :) আমি। ক্লাস ফাইলের ডিরেক্টরিতে ছিলাম এবং java.exe কাজ করছিল না। একবার আমি উপরের সিডি-এড করে প্যাকেজের নামের সাথে এটি চালানো কমান্ড লাইনের সাথে দৌড়ালাম।
নিক কনস্টানটাইন

61

আপনি যদি একটিতে প্রধান শ্রেণি এবং প্রধান পদ্ধতিটি সংজ্ঞায়িত করেন তবে শ্রেণীর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


1
আমার উত্তরের "অতিরিক্ত নোট # 1" দেখুন। এই সমস্যার আরও ভাল ব্যাখ্যা করার জন্য।
স্টিফেন সি

14
@ স্টেফেনসি হ্যাঁ, আপনার উত্তরটি আরও সম্পূর্ণ and এবং এটা কাজ করে. সুতরাং +1 রাজাভি। স্টিফেনসি, আপনার জাভাতে আমি নতুন হওয়ায় আমার প্রয়োজনীয় প্যাকেজ উদাহরণটি নেই।
কিমোর্ট

5
এটা ঠিক আমার সমস্যা ছিল। আমি প্রচুর জাভা ডকটি নিয়ে বেড়াচ্ছি এবং আমার এই দৃ concrete় উদাহরণটি আমার প্রয়োজন
জন

1
হ্যাঁ, কংক্রিটের উদাহরণটি দুর্দান্ত, এটি পুরোপুরি কার্যকর হয়েছিল worked আমি নিশ্চিত যে মূল উত্তরটি খুব ভাল, তবে বনের জন্য গাছটি দেখা খুব কঠিন ছিল। সুন্দর এক @ রাজাভি
পিক্সেল

1
আমি স্বীকৃত পরিবর্তে এই সংক্ষিপ্ত এবং দরকারী উত্তরটি পছন্দ করি!
স্পারা

46

যখন একই কোডটি একটি পিসিতে কাজ করে, তবে এটি অন্যটিতে ত্রুটি দেখায়, আমি যে সর্বোত্তম সমাধানটি খুঁজে পেয়েছি তা হ'ল নিম্নলিখিতগুলির মতো সংকলন করা:

javac HelloWorld.java
java -cp . HelloWorld

2
এটি ভাল প্রস্তাবনা নয়। আপনি ক্লাসস্প্যাথ এনভায়রনমেন্ট ভেরিয়েবলটি আনসেট না হওয়া বা "মান" এর সাথে সামঞ্জস্যপূর্ণ তার উপর নির্ভর করছেন depending হ্যাঁ, এটি অনেক ক্ষেত্রে কাজ করে, তবে অন্যের ক্ষেত্রে তা হয় না।
স্টিফেন সি

অবশ্যই javac -classpath . HelloWorld.javaকাজ করতে হবে! এবং এটি আপনার ক্ষেত্রে একটি ভাল সমাধান।
স্টিফেন সি

2
আপনার যদি প্রথম পংক্তি হিসাবে 'প্যাকেজ com.some.address' থাকে - তবে এটি কার্যকর হবে না। আপনাকে 'প্যাকেজ ঠিকানা' মন্তব্য করতে হবে ..
জো

1
@ জো - এই হ্যাক (প্যাকেজটির বিষয়ে মন্তব্য করা) কাজ করবে (কিছু ক্ষেত্রে) তবে এটি একটি খারাপ ধারণা। আরও ভাল ধারণা হ'ল সমস্যাটি কী কারণে সৃষ্টি হয়েছে তা শিখতে / বুঝতে এবং সঠিক সমাধানটি কার্যকর করা।
স্টিফেন সি

36

কমান্ড লাইনে ক্লাসপথটি নির্দিষ্ট করে আমাকে কী সাহায্য করেছিল, উদাহরণস্বরূপ:

  1. একটি নতুন ফোল্ডার তৈরি করুন, C:\temp

  2. C:\tempএতে নিম্নলিখিত ক্লাসের সাথে টেম্প.জভা ফাইল তৈরি করুন :

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
  3. ফোল্ডারে একটি কমান্ড লাইন খুলুন C:\temp, এবং টেম্প ক্লাসটি সংকলন করতে নিম্নলিখিত কমান্ডটি লিখুন:

    javac Temp.java
  4. সংকলিত জাভা ক্লাস চালাও, জেআরই কে ক্লাসটি -classpathকোথায় পাবেন তা জানাতে বিকল্প যুক্ত করে :

    java -classpath C:\temp Temp Hello!

3
উবুন্টুতেও আমাকে পথটি নির্দিষ্ট করতে হয়েছিল। এটি ডিফল্টরূপে বর্তমান কার্যকারী ডিরেক্টরিটি কেন ব্যবহার করতে পারে না তা বোঝেন না। আমি নিশ্চিত যে জাভা কীবোর্ড নির্মাতারা স্পনসর করেছেন !!
গেছে

1
@ চলে গেছে - যে কারণ " ডিফল্টরূপে AT PATH এ নেই এটি হ'ল এটি একটি সুরক্ষা জাল। seas.upenn.edu/cets/answers/dot-path.html
স্টিফেন সি

এর জন্য অনেক ধন্যবাদ ...... পরিবেশগত ভেরিয়েবলগুলিতে সেট করার পরেও কেন জাভা ক্লাসপাথটি সন্ধান করতে পারছে না তা নিশ্চিত না হলেও।
aકાશ8989

@ আকাশ ৮৮ - সম্ভবত সম্ভাব্য কারণগুলি হ'ল: ১) javaক্লাসপাথের দিকে তাকিয়ে ছিল না (কারণ আপনি ক্লাসপাথ বা-জাজার ব্যবহার করেছেন) বা ২) ক্লাসপাথ সেটিংটি সেই পরিবেশে সেট করা হয়নি যা সেই প্রসঙ্গে কার্যকর ছিল না javawas চালানো; উদাহরণস্বরূপ কারণ আপনি ফাইলটি "উত্স" করেন নি যেখানে ডান শেলটিতে setenv কমান্ড যুক্ত হয়েছে।
স্টিফেন সি

তবুও ত্রুটি পেয়েছি: টেমপ্লেট মুখ্য শ্রেণীর সন্ধান বা লোড করা যায়নি যে কেউ সহায়তা করতে পারে!
তারকা

27

ত্রুটির বার্তা অনুযায়ী ("প্রধান শ্রেণীর সন্ধান বা লোড করা যায়নি"), দুটি ধরণের সমস্যা রয়েছে:

  1. প্রধান শ্রেণি খুঁজে পাওয়া যায়নি
  2. প্রধান শ্রেণিটি লোড করা যায়নি (গ্রহণযোগ্য উত্তরে এই মামলাটি পুরোপুরি আলোচনা করা হয়নি)

প্রধান বর্গ করা যায়নি পাওয়া যখন সেখানে সম্পূর্ণরূপে যোগ্যতাসম্পন্ন বর্গ নামে টাইপো ভুল বা বাক্য গঠন বা এটি প্রদান করা ক্লাসপাথ বিদ্যমান নেই

প্রধান বর্গ যায়নি লোড যখন বর্গ প্রবর্তিত করা যাবে না , সাধারণত প্রধান বর্গ অন্য বর্গ প্রসারিত এবং যে বর্গ প্রদত্ত ক্লাসপাথ মধ্যে বিদ্যমান নেই।

উদাহরণ স্বরূপ:

public class YourMain extends org.apache.camel.spring.Main

যদি উট-বসন্ত অন্তর্ভুক্ত না করা হয় তবে এই ত্রুটিটি রিপোর্ট করা হবে।


"মূলত" এখানে আরও অনেক বিভাগ রয়েছে। এবং অনুপস্থিত সুপারক্লাস সমস্যাটি একটি খুব অস্বাভাবিক সাবকেস। (এতটাই অস্বাভাবিক যে আমি এটি কখনও দেখিনি ... এই সাইটে জিজ্ঞাসা করা প্রশ্নে।)
স্টিফেন সি

TWO রয়েছে কারণ ত্রুটিটি "FIND বা LOAD প্রধান শ্রেণি করতে পারিনি" বলে। যদি অন্য বিভাগগুলি থাকে তবে দয়া করে আমাকে পরামর্শ দিন। আমি এটি দেখেছি, তাই কেবল এখানে এটি ভাগ করে নিতে চাই অন্য কারও কাছে এটির প্রয়োজন হবে।
জিয়াও পেং - ZenUML.com

1
আমি এটিকে এমন কিছু হিসাবে সংশোধন করতাম যে "এই বিশেষ ত্রুটি এড়াতে আপনার অবশ্যই সমস্ত শ্রেণীর অন্তর্ভুক্ত করা দরকার যা মূল শ্রেণীর সূচনা করতে হবে"। আমি আপনাকে বোঝানোর চেষ্টা করছি না। এটি কেবল একটি উপায় যা আমি দেখতে চাই। আমি উত্তরটি এখানে কেবল এমন লোকদের জন্য রেখেছি যারা এইভাবে জিনিসগুলি পড়তে পছন্দ করতে পারে। আসুন এই আলোচনাটি আরও প্রসারিত করি না :) আমি আমার বক্তব্যটি "গৃহীত উত্তরে পুরোপুরি আলোচনা করা হয়নি" তে পরিবর্তন করেছি এবং আশা করি আপনি আরও ভাল বোধ করছেন।
জিয়াও পেং - ZenUML.com

5
এই তথ্যটি গুরুত্বপূর্ণ এবং এটি একটি সুস্পষ্ট উল্লেখের দাবিদার (এটি কেবলমাত্র উত্তর যা উল্লেখ করেছে extends)। আমি কেবল শক্তভাবে শিখেছি যখন যখন প্রধান শ্রেণি লোড করতে ব্যর্থ হয় কারণ এটি অন্যটি প্রসারিত করে যা খুঁজে পাওয়া যায় নি , তখন জাভা কোন প্রকৃত শ্রেণিটি খুঁজে পাওয়া যায় নি (বিপরীতে NoClassDefFoundError) রিপোর্ট করে না । সুতরাং হ্যাঁ এটি ঘটে থাকে, এবং এটি চুলচেরা পরিস্থিতি যখন আপনি এটি জানেন না।
হিউজ এম।

1
এই পরিস্থিতিতে কোন নির্ভরশীল শ্রেণি লোড করতে ব্যর্থ হচ্ছে তা সঠিকভাবে জানার কোনও উপায় আছে?
কার্লোস এ। ইবাররা

16

এই ক্ষেত্রে আমার এমন ত্রুটি ছিল:

java -cp lib.jar com.mypackage.Main

এটি ;উইন্ডোজ এবং :ইউনিক্সের জন্য কাজ করে :

java -cp lib.jar; com.mypackage.Main

হ্যাঁ. এটি সম্ভবত সম্ভবত কারণ আপনি MainJAR ফাইলটিতে নেই। -cp lib.jar;একই জিনিস যেমন মানে -cp lib.jar;. অর্থাত বর্তমান ডিরেক্টরী ক্লাসপাথ উপর অন্তর্ভুক্ত করা হয়।
স্টিফেন সি

অবশেষে ইউনিক্সের জন্য সমস্যাটি স্থির করে দিলেন .. ধন্যবাদ (এর সাথে কাজ করে :)
ভিকি

16

এক্সএডিয়াগ চেষ্টা করুন ।

স্টিভ সি এর উত্তর সম্ভাব্য কেসগুলি সুন্দরভাবে কভার করে, তবে কখনও কখনও নির্ধারণ করা যে ক্লাসটি পাওয়া যায় না বা বোঝা যায়নি তা সহজ নয়। ব্যবহার করুন java -Xdiag(জেডিকে 7 সাল থেকে)। এটি একটি দুর্দান্ত স্ট্যাকট্রেস প্রিন্ট করে যা বার্তা Could not find or load main classবার্তার অর্থ কী তা বোঝার জন্য একটি ইঙ্গিত সরবরাহ করে ।

উদাহরণস্বরূপ, এটি আপনাকে প্রধান শ্রেণীর দ্বারা ব্যবহৃত অন্যান্য শ্রেণীর দিকে নির্দেশ করতে পারে যা খুঁজে পাওয়া যায়নি এবং প্রধান শ্রেণীর বোঝা লোড হতে বাধা দেয়।


16

এই আদেশটি ব্যবহার করুন:

java -cp . [PACKAGE.]CLASSNAME

উদাহরণ: যদি আপনার ক্লাসের নাম হ্যালো.জাভা থেকে হ্যালো.ক্লাস তৈরি করা হয় তবে নীচের আদেশটি ব্যবহার করুন:

java -cp . Hello

যদি আপনার ফাইল হ্যালো.জাভা প্যাকেজ com.demo এর ভিতরে থাকে তবে নীচের কমান্ডটি ব্যবহার করুন

java -cp . com.demo.Hello

জেডিকে 8 এর সাথে অনেক সময় এমন হয় যে ক্লাস ফাইলটি একই ফোল্ডারে উপস্থিত থাকে তবে javaকমান্ডটি ক্লাসপাথের প্রত্যাশা করে এবং এই কারণে আমরা -cp .বর্তমান ফোল্ডারটিকে ক্লাসপথের রেফারেন্স হিসাবে গ্রহণ করি।


এটি কেবল সাধারণ ক্ষেত্রে কাজ করে। আরও জটিল ক্ষেত্রে আরও জটিল ক্লাসপাথ প্রয়োজন।
স্টিফেন সি

এবং >> সত্যিই << সহজ ক্ষেত্রে, -cp .অপ্রয়োজনীয়, কারণ যদি $CLASSPATHসেট না করে থাকে তবে .তা ডিফল্ট শ্রেণিবদ্ধ।
স্টিফেন সি

স্টিফেন নেই, অনেক সময় উইন্ডোজ ডিফল্ট ক্লাসপথে কাজ করে না। আমি এটি তিনটি ভিন্ন মেশিনে চেষ্টা করে দেখেছি, আপনি এটিও চেষ্টা করে দেখতে পারেন।
শাইলু

এটি সম্ভবত কারণ আপনি কোথাও% CLASSPATH% পরিবেশ পরিবর্তনশীল সেট করেছেন। আপনি যদি এটি করেন তবে আপনি ডিফল্ট ক্লাসপথ ব্যবহার করছেন না। ( echo %CLASSPATH%আউটপুট কী করে ?) এবং না, আমি চেক করতে পারি না কারণ আমার উইন্ডোজ পিসি নেই।
স্টিফেন সি

2
কমান্ড লাইন থেকে একটি সহজ প্রোগ্রাম চালানোর চেষ্টা করার সময় এটি আমার পক্ষে কাজ করেছিল
স্নুকিজ

15

কখনও কখনও যে কারণে সমস্যার কারণ হতে পারে তার মূল শ্রেণীর সাথে কোনও সম্পর্ক নেই এবং আমাকে এটিকে কঠিন উপায় খুঁজে বের করতে হয়েছিল। এটি একটি রেফারেন্সড লাইব্রেরি ছিল যা আমি সরে গিয়েছিলাম এবং এটি আমাকে দিয়েছে:

প্রধান শ্রেণীর xxx লিনাক্স খুঁজে পাওয়া বা লোড করা যায় নি Could

আমি কেবলমাত্র সেই উল্লেখটি মুছলাম, আবার যুক্ত করেছি এবং এটি আবার ঠিকঠাক কাজ করেছে।


1
সমস্যাটি মনে হচ্ছে সমস্যাটি হ'ল আপনার আইডিইতে আপনার প্রকল্পের ভাঙা "রেফারেন্স" এর কারণে আপনার একটি ভুল ক্লাসপাথ ছিল। আমি আমার উত্তর আপডেট করব answer
স্টিফেন সি

@ স্টেফেনসি এবং এডুয়ার্ডো ডেনিস, এটি এখানেও একটি জার নিখোঁজ ছিল, সেই জারে একটি ইন্টারফেস ছিল যা মূল শ্রেণি তাত্ক্ষণিকভাবে নির্ভর করে। সুতরাং, ত্রুটি বার্তাটি খুব বিস্তৃত। ক্লাস ফাইলটি পাওয়া না গেলে "সন্ধান করতে পারছি না" বলার অপেক্ষা রাখে না এবং যদি অন্য কিছু অনুপস্থিত থাকে তবে ফাইলটি নিজেই না হারিয়ে "লোড করতে পারে না (নির্ভরতা অনুপস্থিত)", তাই যদি আপনি কেবল ফোকাস করেন তবে ত্রুটি বার্তাটি খুব বিস্তৃত হচ্ছে মিসলাইডিং এর "সন্ধান" অংশে :(
কুম্ভ শক্তি

@ অ্যাকোরিয়াস পাওয়ার - "কারণ" ব্যতিক্রমের জন্য স্ট্যাকট্র্যাসের অতিরিক্ত "কারণ" হওয়া উচিত ছিল যা বলেছিল যে ডাব্লুএইচটি ক্লাসটি অনুপস্থিত ছিল। আপনি যদি জাভা বিকাশকারীদের পরামর্শ দিতে চান যে তারা একটি ত্রুটি বার্তা পরিবর্তন করে যা ২০++ বছর ধরে বলে চলেছে ... নিখরচায় feel (আমি মনে করি ত্রুটির বার্তাটি সঠিক is ​​সমস্যাটি হ'ল >> আপনি << ভুল অনুচ্ছেদে সংকীর্ণ হয়েছিলেন))
স্টিফেন সি

@ স্টেফেনসি আমি যা বোঝাতে চেয়েছি তা হল, মূল শ্রেণীর ফাইলটি পাওয়া যায় বা না পাওয়া যায় তবে তাদের অবশ্যই তথ্যের অ্যাক্সেস রয়েছে, তবে কেন আমাদের আরও ভাল ত্রুটি বার্তা দেখাবেন না যে এই ধরনের ফাইল অনুপস্থিত রয়েছে। অন্যদিকে, তারা এও বলতে পারে যে "ফাইলটি পাওয়া গেছে তবে লোড করা যায়নি", আমরা তাত্ক্ষণিকভাবে অর্ধেক দিন গবেষণা এবং পরীক্ষাগুলি বুঝতে হারানোর পরিবর্তে নির্ভরতাগুলির উপর ফোকাস করব। শুধু আমি বোঝাতে চেয়েছিলাম :)। তারা এটি 20+ বছরের জন্য একটি সীমিত উপায়ে করতে পারে তবে তারা এটির উন্নতি করতে পারে এবং আমাদের সমালোচনা এবং অভিযোগের মধ্য দিয়ে যা ঘটবে তা মঞ্জুরি দেওয়ার জন্য আমরা এখানে আছি! : ডি
কুম্ভ শক্তি

>> আমি << এর অর্থ কী দয়া করে তা অনুগ্রহ করে বুঝুন। এটি সম্পর্কে 3 বছরের পুরানো প্রশ্নোত্তর সম্পর্কে কিছু অস্পষ্ট মন্তব্যে অভিযোগ করা কিছুই অর্জন করতে যাচ্ছে না। আপনার অভিযোগগুলিতে যে লোকেরা স্বাচ্ছন্দ্যে কাজ করতে পারে তারা তা লক্ষ্য করবে না। আপনি যদি গঠনমূলক কিছু করতে চান তবে একটি প্যাচ জমা দিন। (আমি আপনার সম্ভাবনাগুলিকে রেট দিচ্ছি না, তবে আপনি যদি এটির সম্পর্কে কিছু বলেন তবে সেগুলি তার চেয়ে বেশি হবে))
স্টিফেন সি

10

এই উদাহরণে আপনার কাছে রয়েছে:

মেইন ক্লাস ? ক্লাসপাথ খুঁজে পাওয়া বা লোড করা যায় নি ?

এটি কারণ আপনি "-ক্লাসপাথ" ব্যবহার করছেন তবে ড্যাশ javaকমান্ড প্রম্পটে ব্যবহৃত ড্যাশ নয় । আমার এই নোটপ্যাড থেকে সেন্টিমিডি অনুলিপি এবং আটকানো ছিল ।


2
কি দারুন! এটি সম্পূর্ণ উদ্ভট কারণ! (তবে এটি একটি বাস্তব পাঠ্য সম্পাদক পরিবর্তে নোটপ্যাড ব্যবহারের জন্য আপনাকে সঠিকভাবে কাজ করে :-))
স্টিফেন সি

10

আমারও একই সমস্যা হয়েছিল এবং শেষ পর্যন্ত আমার ভুলটি খুঁজে পেয়েছিল :) আমি এই আদেশটি সংকলনের জন্য ব্যবহার করেছি এবং এটি সঠিকভাবে কাজ করেছে:

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

7

আমার ক্ষেত্রে ত্রুটি দেখা দিয়েছে কারণ আমি শ্রেণীর নামের পরিবর্তে উত্স ফাইলের নাম সরবরাহ করেছি।

আমাদের ইন্টারপ্রেটারকে মূল পদ্ধতি সম্বলিত শ্রেণীর নাম সরবরাহ করতে হবে।


হ্যাঁ. আমার উদাহরণটি দেখুন # 2 টির জন্য শ্রেণীর নামটি নির্দিষ্ট করার ভুল উপায় !!
স্টিফেন সি

7

এটি আপনাকে সহায়তা করতে পারে যদি আপনার কেসটি বিশেষত আমার মতো হয়: একটি জাভা প্রোগ্রাম চালানোর চেষ্টা করার সময় একজন শিক্ষানবিস হিসাবে আমিও এই সমস্যার মধ্যে পড়েছিলাম।

আমি এটি এই মত সংকলন:

javac HelloWorld.java

এবং আমি একই এক্সটেনশন দিয়ে চালানোর চেষ্টা করেছি:

java Helloworld.java

আমি যখন অপসারণ করেছি .javaএবং কমান্ডটি পুনরায় লিখেছিলাম java HelloWorldতখন প্রোগ্রামটি পুরোপুরি চলে। :)


2
এর কারণ আপনি আপনার জাভা সংকলিত সংস্করণটি সম্পাদন করছেন। এটি আসলে .class ফাইলটি সম্পাদন করছে
জেসন ভি

রেকর্ডের জন্য, এটি আমার
স্টিফেন সি

6

এখানে সমস্ত উত্তর উইন্ডোজ ব্যবহারকারীদের দিকে নির্দেশিত বলে মনে হচ্ছে। ম্যাকের জন্য, শ্রেণিপথ বিভাজক :নয় ;,। ক্লাসপাঠটি ব্যবহার করে ত্রুটিটি ;যেমন ব্যবহার করা হয় না ততক্ষণে উইন্ডোজ থেকে ম্যাক এ আসা যদি এটি আবিষ্কার করা কঠিন হয়।

এখানে ম্যাক কমান্ডের সাথে সম্পর্কিত:

java -classpath ".:./lib/*" com.test.MyClass

এই উদাহরণে প্যাকেজটি রয়েছে com.testএবং libক্লাসপথে একটি ফোল্ডারও অন্তর্ভুক্ত করা হবে।


2
লিনাক্সে ঠিক ম্যাকের মতোই।
অ্যালেক্স 78191

কেন /*প্রয়োজনীয়?
অ্যালেক্স 78191

এটি একটি ওয়াইল্ডকার্ড সিনট্যাক্স। (এটি বাধ্যতামূলক নয় you আপনি চাইলে স্পষ্টভাবে JARs তালিকাভুক্ত করতে পারেন))
স্টিফেন সি

6

এখানে চিত্র বর্ণনা লিখুন

শ্রেণীর ফাইলের অবস্থান: সি: \ পরীক্ষা \ কম \ সংস্থা

ফাইলের নাম: মেইন.ক্লাস

সম্পূর্ণরূপে যোগ্য শ্রেণীর নাম: com.company.Main

কমান্ড লাইন কমান্ড:

java  -classpath "C:\test" com.company.Main

এখানে নোট করুন যে শ্রেণীর পথে \ com \ সংস্থার অন্তর্ভুক্ত নেই


6

এই সমস্যাটি সমাধানের চেষ্টা করার জন্য আমি একটি শালীন সময় ব্যয় করেছি। আমি ভেবেছিলাম যে আমি কোনওভাবে আমার ক্লাসপথটি ভুলভাবে সেট করে দিচ্ছি তবে সমস্যাটি ছিল আমি টাইপ করেছি:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

পরিবর্তে:

java -cp C:/java/MyClasses utilities/myapp/Cool   

আমি ভেবেছিলাম সম্পূর্ণ প্যাকেজ নামের অর্থ পুরো প্যাকেজের নামের পরিবর্তে পুরো পথের নাম অন্তর্ভুক্ত করা।


আমি এই বিভ্রান্তি দূর করার চেষ্টা করতে আমার উত্তর আপডেট করেছি।
স্টিফেন সি

2
এগুলির কোনওটিই সঠিক নয়। ক্লাসটি অবশ্যই utilities.myapp.Coolতার প্যাকেজের নাম হিসাবে যা কিছু দেওয়া উচিত , যদি থাকে।
ব্যবহারকারী 207421

5

প্রথমে এই আদেশটি ব্যবহার করে পথ নির্ধারণ করুন;

set path="paste the set path address"

তারপরে আপনাকে প্রোগ্রামটি লোড করতে হবে। সঞ্চিত ড্রাইভে "সিডি (ফোল্ডারের নাম)" টাইপ করুন এবং এটি সংকলন করুন। উদাহরণস্বরূপ, যদি আমার প্রোগ্রামটি ডি ড্রাইভে সঞ্চয় থাকে তবে "D:" টাইপ করুন এবং "সিডি (ফোল্ডারের নাম)" টাইপ করুন।


4
এটি কোনও উপকারে আসে না। এই প্রশ্নটি জাভা প্রোগ্রামগুলি সম্পর্কে, সাধারণ নির্বাহযোগ্য নয়। জাভা কিছু সনাক্ত করতে PATH ব্যবহার করে না, এবং যদি "সিডি" সাহায্য করে তবে তা বিচারের পরিবর্তে ভাগ্যের দ্বারা।
স্টিফেন সি

if "cd" helps then it by luck rather than by judgement। এটি ভুল (আমার বিশ্বাস), যেমন জাভা বর্তমান ডিরেক্টরিটি .ডিফল্টরূপে ক্লাসপথের অংশ হিসাবে ব্যবহার করে ।
GKFX

2
@ জি কেএফএক্স - এটাই আমার অর্থ। আপনি যদি না জানেন যে আপনি ডিফল্ট ক্লাসপথটি ব্যবহার করছেন (বা এর উপরে "।" সহ একটি ক্লাসপাথ), "সিডি" এর কোনও প্রভাব থাকবে না। এই সমাধানটি ভাগ্য দ্বারা (যেমন অনুমান / আশা করে যে "।" ক্লাসপাথে রয়েছে) রায় দিয়ে বিচারের চেয়ে বেশি কাজ করে (যেমন "" "পরীক্ষাটি ক্লাসপথে রয়েছে)"। তবুও আপনি ডিফল্ট সম্পর্কে ভুল। জাভা ব্যবহার করে "।" ডিফল্টরূপে ক্লাসপথ হিসাবে, ডিফল্টরূপে ক্লাসপথের অংশ হিসাবে নয়।
স্টিফেন সি

5

আমার ক্ষেত্রে সমস্যাটি কী ঠিক করেছিল তা হ'ল:

আপনি যে প্রকল্প / শ্রেণিতে চালাতে চান তার উপর ডান ক্লিক করুন, তারপরে Run As-> Run Configurations। তারপরে আপনার হয় হয় আপনার বিদ্যমান কনফিগারেশনটি ঠিক করা বা নিম্নলিখিত উপায়ে নতুন যুক্ত করা উচিত:

খোলা Classpath ট্যাব এ ক্লিক করুন Advanced...তারপর বাটন যোগ binফোল্ডারের আপনার প্রকল্পের।


5

আপনি যদি জেআর ফাইলটি তৈরি করতে মাভেন ব্যবহার করেন তবে দয়া করে 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>

4

এটি একটি সুনির্দিষ্ট কেস, তবে যেহেতু আমি এই পৃষ্ঠায় এসে সমাধান খুঁজছি এবং এটি খুঁজে পাইনি, আমি এটি এখানে যুক্ত করব।

উইন্ডোজ (7 এর সাথে পরীক্ষিত á) শ্রেণি এবং প্যাকেজের নামগুলিতে বিশেষ অক্ষর (যেমন ) গ্রহণ করে না । লিনাক্স, যদিও।

.jarনেটবিয়ানে একটি তৈরি করে কমান্ড লাইনে চালানোর চেষ্টা করার সময় আমি এটি খুঁজে পেয়েছি । এটি নেটবিনে চলেছিল কিন্তু কমান্ড লাইনে নয়।


4

উইন্ডোজ .;শুরুতে CLASSPATH মান লাগান।

দ্য . (ডট) এর অর্থ "বর্তমান ডিরেক্টরিতে দেখুন"। এটি একটি স্থায়ী সমাধান।

এছাড়াও আপনি সেট সহ এটি "এক সময়" সেট করতে পারেন CLASSPATH=%CLASSPATH%;.। আপনার সিএমডি উইন্ডোটি যতক্ষণ না খোলা থাকবে ততক্ষণ এটি স্থায়ী থাকবে।


1
এই পরামর্শ সাহায্য বা না পারে। বর্তমান ডিরেক্টরিতে ক্লাস যুক্ত শ্রেণি গাছটি এটি সহায়তা করবে। তারা না থাকলে তা হবে না। আমি আসলে এটি করব না। পরিবর্তে আমি একটি ওয়ান-লাইনার মোড়ক স্ক্রিপ্ট তৈরি করব যা ব্যবহারকারীর "ডান" ডিরেক্টরিতে রয়েছে কিনা তা কাজ করে।
স্টিফেন সি

4

আপনার 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

2
কোনও শ্রেণিকে "কমান্ডলাইন.ক্লাস" বলা যায় না। এটি একটি জাভা সিনট্যাক্স ত্রুটি হবে। (আপনি যা বলতে চাইছেন তা হল সংকলিত শ্রেণিযুক্ত ফাইলটিকে "কমান্ডলাইন.ক্লাস" বলা হয় ...)। অন্যান্য সমস্যাটি হ'ল "উত্স ডিরেক্টরিতে সিডির জন্য" আপনার নির্দেশিকাটি কেবল তখনই কাজ করে যদি আপনি << উত্স ডিরেক্টরি ট্রিতে << কোডটি সংকলন করেন। অবশেষে, যদি আপনার কম্পাইলটি "-cp" যুক্তি ব্যবহার করে, তবে আপনি যখন চালাবেন তখন আপনার সমতুল্য প্রয়োজন।
স্টিফেন সি

আমার প্রোজেক্টে আমার কাছে মূলে src ফোল্ডার এবং বিন ফোল্ডার রয়েছে। আমাকে কমান্ডটি চালাতে cdহয়েছিল srcএবং তারপরে java ../bin com.blah.blah.MyClassআমার জন্য কাজ করেছিল। তাই টিপ জন্য ধন্যবাদ!
tamj0rd2

3

জাভাতে, আপনি যখন কখনও কখনও জাভা এক্সিকিউটেবল ব্যবহার করে কমান্ড লাইন থেকে জেভিএম চালনা করেন এবং সর্বজনীন স্ট্যাটিক শূন্য মূল (পিএসভিএম) দিয়ে কোনও ক্লাস ফাইল থেকে কোনও প্রোগ্রাম শুরু করার চেষ্টা করছেন, আপনি ক্লাসপাথ প্যারামিটারটি সত্ত্বেও নীচের ত্রুটিতে চলে যেতে পারেন জেভিএম সঠিক এবং ক্লাস ফাইলটি ক্লাসপথে উপস্থিত রয়েছে:

Error: main class not found or loaded

PSVM সহ ক্লাস ফাইলটি লোড করা না গেলে এটি ঘটে। এর একটি সম্ভাব্য কারণ হ'ল ক্লাসটি কোনও ইন্টারফেস বাস্তবায়ন করতে পারে বা ক্লাসপথে নেই এমন অন্য শ্রেণি প্রসারিত করতে পারে। সাধারণত কোনও শ্রেণি ক্লাসপথে না থাকলে, নিক্ষেপ করা ত্রুটিটি এরূপ সূচিত করে। তবে, যদি ব্যবহৃত শ্রেণিটি প্রসারিত বা প্রয়োগ করা হয় তবে জাভা নিজেই শ্রেণিটি লোড করতে অক্ষম।

তথ্যসূত্র: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/


1
আপনি কি গৃহীত উত্তরটি পড়েছেন? আপনার উত্তর কি নতুন কিছু যুক্ত করে?
স্টিফেন সি

1
@ স্টেফেনসি আমি "যুক্তি" বিভাগ এবং তাদের বিষয়গুলি দেখে আপনার তালিকার একটি কারণ অনুসন্ধান করার চেষ্টা করেছি। আমি "কারণ # 1" এবং "কারণ # 2" শিরোনামে ম্যাচিং পয়েন্টটি খুঁজে পেলাম না তবে আমার মামলার কাছাকাছি লাগেনি (কারণ আমি নিশ্চিত যে ক্লাসপাথে কোনও সমস্যা নেই)। আমি পরীক্ষা-নিরীক্ষা করে কারণটি খুঁজে পেয়েছি এবং আমি অবাক হয়ে গিয়েছিলাম যে আমার ক্ষেত্রে "প্রধান শ্রেণি পাওয়া যায় নি" ত্রুটি দেখানো হয়েছিল কারণ বাস্তবায়ন ইন্টারফেস শ্রেণীর পথে ছিল না। অবশ্যই আপনি বলতে পারেন যে "আপনার পোস্টে বর্ণিত সমস্ত কিছু পড়া উচিত" তবে আমার কাছে মনে হয় আপনার কারণ তালিকাটি উন্নত হতে পারে।
gumkins

3

যখন চলমান javaসঙ্গে -cpউইন্ডোজ PowerShell মধ্যে বিজ্ঞাপনে যেমন বিকল্পটি কোনো ত্রুটির সম্মুখীন হয়েছেন পারে যে কেমন লাগে কিছু:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

পাওয়ারশেলের কমান্ডটি গ্রহণ করার জন্য, -cpবিকল্পের আর্গুমেন্টগুলি অবশ্যই উদ্ধৃতিতে অন্তর্ভুক্ত থাকতে হবে:

java -cp 'someDependency.jar;.' ClassName

এইভাবে কমান্ডটি গঠনের মাধ্যমে জাভা ক্লাসপাথ আর্গুমেন্টগুলি সঠিকভাবে প্রক্রিয়াকরণ করা উচিত।


3

জাভা মঙ্গোডিবি জেডিবিসি সংযোগ পরীক্ষা করার সময় আমিও একই ধরণের ত্রুটির মুখোমুখি হয়েছি। আমি মনে করি আমার চূড়ান্ত সমাধানটি সংক্ষেপে সংক্ষেপে বলা ভাল যাতে ভবিষ্যতে যে কেউ সরাসরি দুটি আদেশের সন্ধান করতে পারে এবং আরও এগিয়ে যাওয়ার পক্ষে ভাল।

ধরে নিন আপনি যে ডিরেক্টরিতে আপনার জাভা ফাইল এবং বাহ্যিক নির্ভরতা (জেআর ফাইল) বিদ্যমান রয়েছে।

কম্পাইল:

javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -cp - শ্রেণীপথ যুক্তি; একে অপরের উপর নির্ভরশীল জেআর ফাইলগুলি পাস করুন
  • *। জাভা - এটি জাভা ক্লাস ফাইল যাটির প্রধান পদ্ধতি রয়েছে। sdsd

চালান:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • সমস্ত নির্ভরতা জেআর ফাইল শেষ হওয়ার পরে দয়া করে কোলন (ইউনিক্স) / কমা (উইন্ডোজ) পর্যবেক্ষণ করুন
  • শেষে, কোনও বর্ধন ছাড়াই মূল শ্রেণীর নাম পর্যবেক্ষণ করুন (কোনও ক্লাস বা। জাভা)

এটি সমস্তই ধরে নেয় যে 1) JavaMongoDBConnectionএর কোনও প্যাকেজ নেই এবং 2) আপনি ডিরেক্টরি পরিবর্তন করেন না। এটি হ'ল কমপক্ষে, ভঙ্গুর। এবং বিষয় ব্যাখ্যা না করে, এটা নতুনদের নেতৃত্ব এই পদ্ধতির চেষ্টা করবে যেখানে এটি কাজ করবে না পরিস্থিতিতে । সংক্ষেপে, এটি "ভুডো প্রোগ্রামিং কৌশলগুলি" উত্সাহ দেয়: এন.ইউইউইকিপিডিয়া.আর
স্টিফেন সি

3

ঠিক আছে, ইতিমধ্যে অনেক উত্তর রয়েছে, তবে কেউই সেই মামলার উল্লেখ করেনি যেখানে ফাইল অনুমতিগুলি অপরাধী হতে পারে।

চলমান অবস্থায়, কোনও ব্যবহারকারীর জেআর ফাইল বা পথের ডিরেক্টরিগুলির একটিতে অ্যাক্সেস নাও থাকতে পারে। উদাহরণস্বরূপ, বিবেচনা করুন:

জার ফাইল ভিতরে /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 এর জন্য ঘটে।


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" />

2

আমি এখানে বর্ণিত সমাধানগুলি সহ এই সমস্যাটি সমাধান করতে অক্ষম ছিলাম (যদিও বর্ণিত উত্তরটিতে আমার সন্দেহগুলি পরিষ্কার হয়েছে)। আমি দুবার এই সমস্যার মুখোমুখি হয়েছি এবং প্রতিবারই আমি আলাদা সমাধান চেষ্টা করেছি (এক্সপ্লিস আইডিইতে)।

  • প্রথমত, আমি mainআমার প্রকল্পের বিভিন্ন শ্রেণিতে একাধিক পদ্ধতি নিয়ে এসেছি। সুতরাং, আমি mainপরবর্তী ক্লাস থেকে পদ্ধতিটি মুছে ফেলেছি ।
  • দ্বিতীয়ত, আমি নিম্নলিখিত সমাধানগুলি চেষ্টা করেছিলাম:
    1. আমার মূল প্রকল্প ডিরেক্টরিতে ডান ক্লিক করুন।
    2. উত্স থেকে হেড করুন তারপর পরিষ্কার করুন এবং ডিফল্ট সেটিংস এবং সমাপ্তির সাথে আঁকুন। কিছু পটভূমি কাজের পরে আপনাকে আপনার মূল প্রকল্প ডিরেক্টরিতে পরিচালিত করা হবে।
    3. এর পরে আমি আমার প্রকল্পটি বন্ধ করে দিচ্ছি, এটি আবার খুলুন এবং বুম করুন, অবশেষে আমি আমার সমস্যার সমাধান করেছি।

1
mainপদ্ধতিগুলি মোছা সমস্যার সমাধান করবে না। একাধিক এন্ট্রি পয়েন্ট রয়েছে এমন কোনও অ্যাপ্লিকেশনটিতে প্রযুক্তিগতভাবে কোনও ভুল নেই।
স্টিফেন সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.