আমি জাভাতে কেন নোক্লাসডিফফাউন্ডআরার পাচ্ছি?


528

আমি NoClassDefFoundErrorআমার জাভা অ্যাপ্লিকেশনটি চালানোর সময় আমি একটি পেয়ে যাচ্ছি । সাধারণত এর কারণ কী?


1
আমি বিশ্বাস করি যদি আপনি আপনার জাভা প্রোগ্রামটি সঠিক সিনট্যাক্স দিয়ে চালান না তবে এটিও ঘটতে পারে। উদাহরণস্বরূপ, আপনাকে পুরো প্যাকেজের নাম (যেমন। My.package.myClass) দিয়ে রুট বিন ফোল্ডার থেকে আপনার ক্লাসটি কল করতে হবে। আমি পারলে আমি আরও নির্দিষ্ট হতে পারি তবে আমি জাভা লোকের বেশি নই। আমার মনে আছে এটি কয়েক বার গণ্ডগোল করেছে।
খোলাখুলি হ্যাডার

17
@ বোল্টক্লক আমাদের কাছে বহু নকলকে নির্দেশ করতে একটি প্রমিত প্রশ্ন দরকার। কেন এটা হতে পারে না?
রায়েডওয়াল্ড

21
আপনি কি গৃহীত উত্তর পরিবর্তন করার বিষয়টি বিবেচনা করেছেন যাতে সম্প্রদায়টি যেটিকে আরও মূল্যবান বলে মনে হয় তার শীর্ষে রয়েছে?
মার্টিন স্মিথ

উত্তর:


263

এমন কোনও শ্রেণীর ফাইল রয়েছে যা আপনার কোডের উপর নির্ভর করে এবং এটি সংকলন সময়ে উপস্থিত রয়েছে তবে রানটাইমটিতে পাওয়া যায় নি caused আপনার বিল্ড টাইম এবং রানটাইম ক্লাসপাথগুলিতে পার্থক্য সন্ধান করুন।


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

1
আমার ফাইলটি আপলোড করার সময় আমার সার্ভারের স্মৃতিশক্তি শেষ হয়ে যাওয়ার পরে আমার এই ত্রুটি হয়েছিল। প্রতিবার আমি আপলোডটি চেষ্টা করার সময়, আমি একটি ভিন্ন ত্রুটি পেয়েছি। অবশেষে এটি আমাকে জানিয়েছে যে আমার কাছে পর্যাপ্ত apੇਰ জায়গা নেই।
জেমস এম। লে

79
এই উত্তরটি অগত্যা সত্য নয় এবং অনেক লোকের কাছে বিভ্রান্তিকর হবে! নীচে জারেড থেকে আরও ভাল উত্তর দেখুন।
ডেভ এল।

4
@DaveL। ধন্যবাদ! 400+ upvotes সহ জারেডের উত্তর নীচে নীচে! -4 আপ (ডাউন?) ভোট সহ একটি উত্তর এটির উপরে। এসওর উত্তর অর্ডার দেওয়ার যুক্তি সম্পর্কে কিছুটা মজাদার বিষয় রয়েছে।
সৌরভ পাতিল

1
এটি কারও পক্ষে দীর্ঘস্থায়ী, তবে আমি এই ত্রুটির মুখোমুখি হয়েছি কারণ প্রশ্নে ক্লাসে একটি সিম্পলডেট ফর্ম্যাট রয়েছে যা একটি অবৈধ চরিত্র দিয়ে শুরু করা হয়েছিল ('টি'র পরিবর্তে আমার মাঝখানে টি ছিল)।
রায়ান ডি

815

যদিও এটি সম্ভব যে এটি সংকলন-সময় এবং রান-টাইমের মধ্যে একটি শ্রেণিপথের অমিলের কারণে, এটি অগত্যা সত্য নয়।

এই ক্ষেত্রে দুটি বা তিনটি ভিন্ন ব্যতিক্রম সরাসরি আমাদের মাথায় রাখা গুরুত্বপূর্ণ:

  1. java.lang.ClassNotFoundException এই ব্যতিক্রম ইঙ্গিত দেয় যে ক্লাসপথে ক্লাসটি পাওয়া যায় নি। এটি ইঙ্গিত করে যে আমরা শ্রেণি সংজ্ঞাটি লোড করার চেষ্টা করছিলাম এবং ক্লাসপাথে ক্লাসটির অস্তিত্ব ছিল না।

  2. java.lang.NoClassDefFoundError এই ব্যতিক্রমটি ইঙ্গিত করে যে জেভিএম কোনও শ্রেণীর সংজ্ঞার জন্য এটির অভ্যন্তরীণ শ্রেণীর সংজ্ঞা ডেটা কাঠামো দেখেছিল এবং এটি খুঁজে পায়নি। এটি ক্লাসপথ থেকে লোড করা যায়নি এটি বলার চেয়ে আলাদা। সাধারণত এটি ইঙ্গিত করে যে আমরা আগে ক্লাসপথ থেকে কোনও শ্রেণি লোড করার চেষ্টা করেছি, তবে এটি কোনও কারণে ব্যর্থ হয়েছিল - এখন আমরা আবার ক্লাসটি ব্যবহার করার চেষ্টা করছি (এবং এটি শেষ বার ব্যর্থ হওয়ায় এটি লোড করা দরকার) তবে আমরা ' এমনকি এটি লোড করার চেষ্টাও করব না, কারণ আমরা এটি লোড করার আগে ব্যর্থ হয়েছিলাম (এবং যুক্তিসঙ্গতভাবে সন্দেহ করি যে আমরা আবার ব্যর্থ হব)। আগের ব্যর্থতা ClassNotFoundException বা একটি ExceptionInInitializerError (স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লকে ব্যর্থতা নির্দেশ করে) বা অন্যান্য যে কোনও সমস্যা হতে পারে। মুল বক্তব্যটি হ'ল কোনও নোক্লাসডিফফাউন্ডআরার অগত্যা কোনও ক্লাসপথ সমস্যা নয়।


30
NoClassDefFoundError এর কারণ উল্লেখ করার জন্য ধন্যবাদ, এটি আমাকে অনেক সাহায্য করেছে! আমার ক্ষেত্রে একটি এক্সসেপশনআইনিটায়ালাইজার এরর আগে নিক্ষেপ করা হয়েছিল, আমি স্থির ব্লকের ত্রুটিগুলি সম্পর্কে এটি জানতে পেরেছিলাম।
থমাস

@ জ্যারেড, যখন আমি পাচ্ছি Error: Could not find or load main class, এটি কোন বিভাগের ত্রুটির অধীনে শ্রেণিবদ্ধ করা হবে?
বিক্রম

@ পোপস: "চেষ্টা করুন" ক্রিয়াপদগুলির অবজেক্টগুলি নির্দিষ্ট করার জন্য ভাষাকে আরও ভার্বোজ বানান :)
জ্যারেড

1
@ ভিক্রাম "প্রধান শ্রেণীর সন্ধান বা লোড করতে পারে নি" জাভা ব্যতিক্রম নয়, এটি লঞ্চারের কারণে ঘটে (যা জেআর এবং মূল প্রকাশ্য বৈশিষ্ট্যটি পরিদর্শন করে)।
21:38-

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

124

উদাহরণস্বরূপ কোডটি এখানে java.lang.NoClassDefFoundError। বিস্তারিত ব্যাখ্যার জন্য দয়া করে জারেডের উত্তর দেখুন ।

NoClassDefFoundErrorDemo.java

public class NoClassDefFoundErrorDemo {
    public static void main(String[] args) {
        try {
            // The following line would throw ExceptionInInitializerError
            SimpleCalculator calculator1 = new SimpleCalculator();
        } catch (Throwable t) {
            System.out.println(t);
        }
        // The following line would cause NoClassDefFoundError
        SimpleCalculator calculator2 = new SimpleCalculator();
    }

}

SimpleCalculator.java

public class SimpleCalculator {
    static int undefined = 1 / 0;
}

3
এবং কারণটি হল যে প্রথম চেষ্টা করার পরে jvm ইতিমধ্যে জানে এটির কাজ হচ্ছে না এবং দ্বিতীয়বার ভিন্ন ব্যতিক্রম ছুঁড়ে?
ইকামেন

@ কিকমেন স্পষ্টতই এটি কোথাও SimpleCalculatorশূন্য দ্বারা বিভাজনের পরে ব্যর্থ শ্রেণীর সূচনা শুরু করে দিয়েছে? কারও কি এই আচরণের জন্য অফিসিয়াল ডকুমেন্টেশনের একটি উল্লেখ রয়েছে?
40

4
ফিলিপরিগো নিশ্চিত হন না যে আপনি 'খাঁটি' নোক্লাসডিফফাউন্ডআরার দ্বারা কী বোঝাচ্ছেন। প্রথমবার new SimpleCalculator()বলা হয়, আপনি অ্যারিমেটিকএক্সসেপশনজনিত কারণে একটি এক্সসেপশনআইনিআইটিয়ালাইজার পাবেন। দ্বিতীয়বার যখন আপনি কল new SimpleCalculator()করবেন তখন কোনও নোক্লাসডিফফাউন্ডআরার অন্য কোনওর মতো খাঁটি পাবেন। মুল বক্তব্যটি হ'ল আপনি NoClassDefFoundError কোনও কারণে সিম্পলক্যালকুলেটর.ক্লাস রানটাইমে ক্লাসপথে না থাকা ছাড়া পেতে পারেন।
হার্পারস্কা

36

জাভাতে NoClassDefFoundError

সংজ্ঞা:

  1. জাভা ভার্চুয়াল মেশিন রানটাইমের সময় নির্দিষ্ট ক্লাসটি সন্ধান করতে সক্ষম নয় যা সংকলনের সময় পাওয়া গিয়েছিল।

  2. সংকলনের সময় যদি কোনও শ্রেণি উপস্থিত ছিল তবে রানটাইম চলাকালীন জাভা ক্লাসপথে পাওয়া যায় না।

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

উদাহরণ:

  1. ক্লাসটি ক্লাসপথে নেই, এটি জানার কোনও শট উপায় নেই তবে অনেক সময় আপনি কেবল System.getproperty ("java.classpath") মুদ্রণ করতে পারেন এবং এটি ক্লাসপথটি সেখান থেকে মুদ্রণ করবে আপনি কমপক্ষে পেতে পারেন আপনার আসল রানটাইম ক্লাসপাথের একটি ধারণা।
  2. NoClassDefFoundError এর একটি সহজ উদাহরণ ক্লাসটি অনুপস্থিত জেআর ফাইলের সাথে সম্পর্কিত বা জেআরকে ক্লাসপথে যুক্ত করা হয়নি বা কখনও কখনও জারের নামটি কেউ বদলেছে যেমন আমার ক্ষেত্রে আমার একজন সহকর্মী টিবকো.জারকে টিবকো_ভি 3.জারে পরিবর্তন করেছে এবং প্রোগ্রামটি হ'ল জাভা.আলং.নোক্লাসডেফফাউন্ডআরার সাথে ব্যর্থ হলাম এবং আমি ভাবছিলাম যে কী হয়েছে।

  3. আপনি যে ক্লাসপাথটি কাজ করবেন বলে মনে করেন তা স্পষ্টভাবে-ক্লাসপাথ বিকল্প দিয়ে চালানোর চেষ্টা করুন এবং যদি এটি কাজ করে তবে এটি একটি নিশ্চিত সংক্ষিপ্ত চিহ্ন যে কেউ জাভা ক্লাসপাথকে ওভাররাইড করছে।

  4. JAR ফাইলে অনুমতি ইস্যু জাভাতে NoClassDefFoundError কারণ হতে পারে।
  5. এক্সএমএল কনফিগারেশনে টাইপও জাভাতে NoClassDefFoundError হতে পারে।
  6. যখন আপনার সংকলিত শ্রেণি যা একটি প্যাকেজে সংজ্ঞায়িত করা হয়েছে, JApplet এর মতো লোড করার সময় একই প্যাকেজে উপস্থিত না হয় এটি জাভাতে NoClassDefFoundError নিক্ষেপ করবে।

সম্ভাব্য সমাধান:

  1. ক্লাসটি জাভা ক্লাসপথে পাওয়া যায় না।
  2. আপনি যদি J2EE পরিবেশে একাধিক শ্রেণীবদ্ধার মধ্যে শ্রেণীর দৃশ্যমানতার চেয়ে বেশি কাজ করছেন তবে java.lang.NoClassDefFoundErrorও ঘটতে পারে, বিস্তারিত আলোচনার জন্য উদাহরণ এবং দৃশ্যাংশ দেখুন see
  3. আপনার লগ ফাইলে java.lang.ExceptionInInitializerError জন্য পরীক্ষা করুন। স্থির সূচনা ব্যর্থতার কারণে NoClassDefFoundError বেশ সাধারণ।
  4. কারণ NoClassDefFoundError java.lang.LinkageError এর একটি সাবক্লাস, এটি যদি দেশীয় গ্রন্থাগারের মতো নির্ভরতা নাও পাওয়া যায় তবে তা আসতে পারে।
  5. কোনও স্টার্ট-আপ স্ক্রিপ্ট ক্লাসপাথ এনভায়রনমেন্ট ভেরিয়েবলকে ওভাররাইড করে।
  6. আপনি জার কমান্ড ব্যবহার করে আপনার প্রোগ্রামটি চালাচ্ছেন এবং ক্লাসটি ম্যানিফেস্ট ফাইলের ক্লাসপাথ বৈশিষ্ট্যে সংজ্ঞায়িত হয়নি।

সম্পদ:

NoClassDefFoundError সমাধানের 3 টি উপায়

java.lang.NoClassDefFoundError সমস্যা নিদর্শন


1
দুর্দান্ত উত্তর। আমি মনে করি আপনার প্রস্তাবিত সবকিছু চেষ্টা করেছি এবং এখনও সমস্যা আছে। বসন্তের সাথে কাজ করার জারের কারণে আমি এর মধ্যে কিছুটি বাদ দিতে পারি, তবে মনে হয় জাভা.এসকিএল (আমার ক্ষেত্রে সানার ডিবি ড্রাইভার হানার পক্ষে) পছন্দ করবে না।
জেই কার্টার দ্বিতীয়

এটি প্রকৃতপক্ষে System.getproperty ("java.class.path") নামে পরিচিত
RIJIK

33

আমি খুঁজে পেয়েছি যে কখনও কখনও কোডটি রানটাইমের সময় পাওয়া ক্লাসের একটি বেমানান সংস্করণ সহ সংকলিত হয়ে থাকে তখন আমি একটি নো ক্লাসডিফফাউন্ড ত্রুটি পাই। আমি যে নির্দিষ্ট উদাহরণটি স্মরণ করি তা হ'ল অ্যাপাচি অক্ষ লাইব্রেরির সাথে। আমার রানটাইম ক্লাসপথে আসলে 2 টি সংস্করণ ছিল এবং এটি কোনও পুরানো ও অসামঞ্জস্যিত সংস্করণ এবং সঠিক সংস্করণটি তুলছিল যা একটি নো ক্লাসডিফফাউন্ড ত্রুটির কারণ হয়েছিল। এটি একটি কমান্ড লাইন অ্যাপে ছিল যেখানে আমি এর অনুরূপ একটি কমান্ড ব্যবহার করছি।

set classpath=%classpath%;axis.jar

আমি এটি ব্যবহার করে সঠিক সংস্করণটি তুলতে সক্ষম হয়েছি:

set classpath=axis.jar;%classpath%;

4
একই সমস্যা ছিল। দেখা যাচ্ছে আমি জাভা 7 এর সাথে যুদ্ধের ফাইলটি সংকলন করেছি, তবে আমার টমক্যাট ইনস্টলেশনটি জাভা 6 ব্যবহার করছে। আমাকে আমার পরিবেশগত পরিবর্তনশীলগুলি আপডেট করতে হয়েছিল
du

4
যদি এটির মতো ঘটে থাকে তবে আমি বলব জাভা গোলযোগের মধ্যে রয়েছে। এটি সত্য হলে +2। এটি এখনও যাচাই করতে পারে না। যদি সত্যটি পাওয়া যায় তবে এটি আবার +1 করবে (মন্তব্যগুলিতে)
সুপারনোভা

7

এটি আমি এখনও অবধি খুঁজে পাওয়া সেরা সমাধান

ধরুন আমাদের কাছে org.mypackageক্লাস যুক্ত একটি প্যাকেজ রয়েছে :

  • হ্যালো ওয়ার্ল্ড (প্রধান শ্রেণি)
  • SupportClass
  • UtilClass

এবং এই প্যাকেজটি সংজ্ঞায়িত করা ফাইলগুলি শারীরিকভাবে ডিরেক্টরিতে D:\myprogram(উইন্ডোজে) বা /home/user/myprogram(লিনাক্সে) সংরক্ষণ করা হয়।

ফাইলের কাঠামোটি এর মতো দেখাবে: এখানে চিত্র বর্ণনা লিখুন

আমরা যখন জাভা ডাকা, আমরা অ্যাপ্লিকেশন চালানোর জন্য নাম উল্লেখ করুন: org.mypackage.HelloWorld। তবে আমাদের জাভাটি অবশ্যই আমাদের প্যাকেজ সংজ্ঞায়িত ফাইল এবং ডিরেক্টরিগুলির সন্ধান করতে হবে তা অবশ্যই বলতে হবে। সুতরাং প্রোগ্রামটি চালু করতে, আমাদের নিম্নলিখিত কমান্ডটি ব্যবহার করতে হবে: এখানে চিত্র বর্ণনা লিখুন


6

আমি মাভেনের সাথে স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করছিলাম এবং আমার প্রকল্পে এই ত্রুটিটি সমাধান করেছি।

ক্লাসে একটি রানটাইম ত্রুটি ছিল। আমি পূর্ণসংখ্যা হিসাবে একটি সম্পত্তি পড়ছিলাম, কিন্তু যখন এটি সম্পত্তি ফাইল থেকে মানটি পড়বে তখন এর মান দ্বিগুণ হয়েছিল।

বসন্ত আমাকে কোন লাইনে রানটাইম ব্যর্থ হয়েছিল তার পুরো স্ট্যাক ট্রেস দেয়নি। এটা সহজভাবে বলেছেন NoClassDefFoundError। কিন্তু যখন আমি এটিকে একটি জাভা অ্যাপ্লিকেশন হিসাবে প্রয়োগ করি (এটি এমভিসি থেকে বের করে) তখন এটি দেয় ExceptionInInitializerErrorযা সত্য কারণ এবং আমি কীভাবে ত্রুটিটি চিহ্নিত করেছি।

@ xli- এর উত্তর আমাকে আমার কোডে কী ভুল হতে পারে তার অন্তর্দৃষ্টি দিয়েছে।


1
সার্ভলেট প্রোগ্রামিং করার সময় আমার কাছে একই ঘটনা ঘটেছিল ( NoClassDefFoundErrorআসলে এটি দ্বারা সৃষ্ট হয়েছিল ExceptionInInitalizerError, যার কারণে ঘটেছিল DateTimeParseException)। এটি কিছুটা বিভ্রান্তিকর, তাই না? আমি জানি তাদের সম্ভবত এটির মতো করে তৈরি করার কারণ ছিল, তবে কমপক্ষে একটি ছোট ইঙ্গিতটি পাওয়া খুব ভাল লাগবে, এটি NoClassDefFoundErrorকেটে নেওয়ার প্রয়োজন ছাড়াই অন্য ব্যতিক্রমের ফলস্বরূপ। শুধু ExceptionInInitializerErrorআবার নিক্ষেপ আরও স্পষ্ট হবে। কখনও কখনও দুজনের মধ্যে সংযোগটি স্পষ্ট নাও হতে পারে।
বার্তোমিয়েজ জিলিয়েস্কি

5

আমি NoClassFoundError পাই যখন রানটাইম ক্লাস লোডার দ্বারা লোড করা ক্লাসগুলি ইতিমধ্যে জাভা রুটলোডার দ্বারা লোড হওয়া ক্লাসগুলি অ্যাক্সেস করতে পারে না। কারণ বিভিন্ন শ্রেণীর লোডারগুলি বিভিন্ন সুরক্ষা ডোমেনে রয়েছে (জাভা অনুসারে) jvm রুটলোডার দ্বারা ইতিমধ্যে লোড হওয়া ক্লাসগুলিকে রানটাইম লোডার ঠিকানার জায়গায় সমাধান করার অনুমতি দেবে না।

আপনার প্রোগ্রামটি 'জাভা-জাভাজনেন্ট: ট্রেসআরজার [আপনার জাভা আরজিএস]' দিয়ে চালান

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

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}

1
লিঙ্কটি মারা গেছে। সংরক্ষণাগারিত সংস্করণটি চেষ্টা করুন: web.archive.org/web/20131216000019/https://blogs.oracle.com/…
avgvstvs

5

একটি আকর্ষণীয় ক্ষেত্রে যেখানে আপনি প্রচুর দেখতে পাবেন NoClassDefFoundErrorsতা হ'ল আপনি:

  1. throwএকটি RuntimeExceptionমধ্যে staticআপনার বর্গ ব্লকExample
  2. এটিকে বিরত করুন (বা এটি যদি কোনও পরীক্ষার ক্ষেত্রে ফেলে দেওয়া হয় ঠিক তেমন কিছু যায় না )
  3. এই শ্রেণীর উদাহরণ তৈরি করার চেষ্টা করুন Example

static class Example {
    static {
        thisThrowsRuntimeException();
    }
}

static class OuterClazz {

    OuterClazz() {
        try {
            new Example();
        } catch (Throwable ignored) { //simulating catching RuntimeException from static block
            // DO NOT DO THIS IN PRODUCTION CODE, THIS IS JUST AN EXAMPLE in StackOverflow
        }

        new Example(); //this throws NoClassDefFoundError
    }
}

NoClassDefErrorExceptionInInitializerErrorস্থির ব্লক সহ নিক্ষেপ করা হবে RuntimeException


আপনি যখন NoClassDefFoundErrorsআপনার ইউনিট টেস্টগুলিতে দেখেন এটি বিশেষত গুরুত্বপূর্ণ ।

একটি উপায়ে আপনি staticপরীক্ষার মধ্যে ব্লক নির্বাহকে "ভাগ করে" নিচ্ছেন, তবে প্রাথমিকটি ExceptionInInitializerErrorকেবল একটি পরীক্ষার ক্ষেত্রে হবে। প্রথমটি যা সমস্যাযুক্ত Exampleশ্রেণি ব্যবহার করে । অন্যান্য পরীক্ষার কেসগুলি যা Exampleক্লাসটি ব্যবহার করে তা কেবল নিক্ষেপ করবে NoClassDefFoundErrors


4
বাস্তব জীবনের পরামর্শের জন্য এটি বেশ অভিহিত। ক্লাস অ্যাট্রিবিউট আরম্ভকারীদের সাথে আমার ঠিক একই অবস্থা ছিল। লগতে আপনার আসল সমস্যাটি একবার দেখার সুযোগ রয়েছে। ক্লাসটি লোড হয়ে গেলে (বা যাইহোক চেষ্টা করা হয়েছে) আপনাকে সবকিছু পুনরায় আরম্ভ করতে হবে।
ডেলিফ্যাঙ্কপিটার 14

4

নীচের কৌশলটি আমাকে বহুবার সহায়তা করেছিল:

System.out.println(TheNoDefFoundClass.class.getProtectionDomain().getCodeSource().getLocation());

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


3

আপনি যদি জেনারেট-কোড (ইএমএফ ইত্যাদি) তৈরি করে থাকেন তবে অনেকগুলি স্ট্যাটিক ইনিশিয়ালিসার থাকতে পারে যা সমস্ত স্ট্যাকের জায়গা খায়।

স্ট্যাক ওভারফ্লো প্রশ্ন দেখুন জাভা স্ট্যাকের আকারটি কীভাবে বাড়ানো যায়?


"ইএমএফ" ? আপনার অর্থ " এমইএফ " ?
পিটার মর্টেনসেন

2
নাঃ। ELf Eclipse Modeling ফ্রেমওয়ার্ক হিসাবে। স্বয়ংচালিত উত্পন্ন কোড চালানোর সময় আমরা এই ত্রুটির মুখোমুখি হতে পারি।
আইকুট কলিক

1

আমি সমস্ত মডিউলের জন্য প্রি ডেক্স লাইব্রেরিগুলি অক্ষম করে আমার সমস্যাটি সমাধান করেছি:

dexOptions {
        preDexLibraries false
        ...

1

NoClassDefFoundErrorস্ট্যাটিক ইনিশিয়েলজার যখন রানটাইমে পাওয়া যায় না এমন কোনও রিসোর্স বান্ডিল লোড করার চেষ্টা করে তখনও ঘটতে পারে , উদাহরণস্বরূপ এমন একটি সম্পত্তি ফাইল যা প্রভাবিত শ্রেণি META-INFডিরেক্টরি থেকে লোড করার চেষ্টা করে , কিন্তু সেখানে থাকে না। আপনি যদি ধরেন না NoClassDefFoundError, কখনও কখনও আপনি পুরো স্ট্যাক ট্রেস দেখতে পাবেন না; এ থেকে উত্তরণের জন্য আপনি সাময়িকভাবে এর জন্য একটি catchধারা ব্যবহার করতে পারেন Throwable:

try {
    // Statement(s) that cause the affected class to be loaded
} catch (Throwable t) {
    Logger.getLogger("<logger-name>").info("Loading my class went wrong", t);
}

এটি ভুল। অনুপস্থিত সংস্থান আপনাকে এই ত্রুটিটি দেবে না। কোনও ক্লাস অনুপস্থিত থাকলে আপনি এটি পাবেন ।
স্টিফেন সি

@ স্টেফেনসি হয়ত আমার সেই অংশটি আরও জোর দেওয়া উচিত, তবে আমি লিখেছি for example a properties file that the affected class tries to load from the META-INF directory। এটি আমার কাছে আসলে ঘটেছে এবং আমি NoClassDefFoundErrorনিখোঁজ সম্পত্তি ফাইল যুক্ত করে সমাধান করতে সক্ষম হয়েছি । আমি এই উত্তরটি ঠিক যুক্ত করেছি কারণ কেউ উল্লিখিত পরিস্থিতিতে এই ত্রুটিটি আশা করে না।
3

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

যদি আমি ভুল হয়ে থাকি (যেমন এটি ব্যর্থ staticআরম্ভের কারণে নয় ), তবে আমি আচরণের প্রদর্শিত একটি প্রকৃত উদাহরণ (অর্থাত্ একটি এমসিভিই) দেখতে আগ্রহী হব।
স্টিফেন সি

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

1

আমি এই ত্রুটিটি পেয়েছি যখন আমি আমার প্রকল্পে অন্য মডিউলের মাভেন নির্ভরতা যুক্ত করি, অবশেষে -Xss2mআমার প্রোগ্রামটির জেভিএম বিকল্পে যুক্ত হয়ে সমস্যাটি সমাধান করা হয়েছিল (এটি জেডিকে 5.0 এর পরে ডিফল্টরূপে একটি মেগাবাইট)। এটি বিশ্বাস করা হয় যে প্রোগ্রামটিতে ক্লাস লোড করার মতো পর্যাপ্ত পরিমাণ নেই।


0

যদি কেউ এখানে java.lang.NoClassDefFoundError: org/apache/log4j/Loggerত্রুটির কারণে আসে তবে আমার ক্ষেত্রে এটি উত্পাদিত হয়েছিল কারণ আমি লগ 4 জ 2 ব্যবহার করেছি (তবে আমি এর সাথে আসা সমস্ত ফাইল যুক্ত করি নি), এবং কিছু নির্ভরতা গ্রন্থাগার লগ 4 জে ব্যবহার করেছিল। সমাধানটি লগ 4 জে যুক্ত করা হয়েছিল 1.x ব্রিজ: লগ log4j-1.2-api-<version>.jar4j সহ যে জারটি আসে 2. লগ 4 জ 2 মাইগ্রেশনে আরও তথ্য ।


0

একই প্রকল্পের দুটি পৃথক চেকআউট অনুলিপি

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

প্রকল্পের ট্রাঙ্ক অনুলিপিটি বন্ধ করে পরীক্ষা মামলা চালানো আবার সমস্যা থেকে মুক্তি পেয়েছে।


0

এই ত্রুটিটি চেক করা জাভা সংস্করণ প্রয়োজনীয়তার কারণে হতে পারে।

আমার ক্ষেত্রে আমি এসডিকেএমএন ব্যবহার করে জাভা 9 থেকে জাভা 8 এ স্যুইচ করে একটি হাই-প্রোফাইল ওপেন-সোর্স প্রকল্প তৈরি করার সময়, এই ত্রুটিটি সমাধান করতে সক্ষম হয়েছি!

sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu

তারপরে নীচে বর্ণিত হিসাবে একটি পরিষ্কার ইনস্টল করছেন।


মাভেনকে আপনার বিল্ড টুল হিসাবে ব্যবহার করার সময় এটি কখনও কখনও সহায়ক - এবং সাধারণত সন্তুষ্টিজনক হয়, পরীক্ষার অক্ষম করে একটি পরিষ্কার 'ইনস্টল' বিল্ড করতে

mvn clean install -DskipTests

এখন সবকিছু নির্মিত এবং ইনস্টল করা হয়েছে, আপনি এগিয়ে যান এবং পরীক্ষা চালাতে পারেন।

mvn test

0

আমার প্রকল্পের জাভা বিল্ড পাথের "অর্ডার এবং রফতানি" ট্যাবে কোনও শ্রেণি রফতানি না করার সময় আমি NoClassDefFound ত্রুটি পেয়েছি। আপনি প্রকল্পের নির্মাণের পথে যুক্ত হওয়া কোনও নির্ভরতাগুলির "অর্ডার এবং রফতানি" ট্যাবে একটি চেকমার্ক স্থাপন নিশ্চিত করে নিন। গ্রহণের সতর্কতা দেখুন : XXXXXXXXXXX.jar রফতানি বা প্রকাশ করা হবে না। রানটাইম ক্লাসনটফাউন্ডএক্সেপশনগুলির ফলাফল হতে পারে


0

এটি এমনও হতে পারে কারণ আপনি একটি নির্দিষ্ট প্যাকেজের নাম দিয়ে কোনও আইডিই থেকে কোড ফাইলটি অনুলিপি করেছেন এবং আপনি এটি টার্মিনাল ব্যবহার করে চালানোর চেষ্টা করতে চান। আপনাকে প্রথমে কোড থেকে প্যাকেজের নামটি সরিয়ে ফেলতে হবে। এটা আমার সাথে ঘটে।


0

আমার ক্ষেত্রে আমি এই ত্রুটিটি জেডিকে সংস্করণগুলিতে না মিলার কারণে পেয়েছিলাম। আমি যখন ইন্টেলিজ থেকে অ্যাপ্লিকেশনটি চালানোর চেষ্টা করছিলাম তখন এটি কাজ করে না তবে কমান্ড লাইন থেকে এটি চালানো কাজ করে। এটি কারণ জাভা ১১ জেডিকে সেটআপ করা ইন্টিলিজ এটি চালানোর চেষ্টা করছিল তবে কমান্ড লাইনে এটি জাভা 8 জেডিকে নিয়ে চলছে। ফাইল> প্রকল্পের কাঠামো> প্রকল্প সেটিংস> প্রকল্প এসডিকে এর অধীনে সেটিংটি স্যুইচ করার পরে, এটি আমার পক্ষে কাজ করেছিল।


0

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


0

আমি লিবার্টি সার্ভারের সাথে কাজ করে জাভাতে NoClassDefFoundError সহ একটি আকর্ষণীয় সমস্যা পেয়েছি। আমি আইএমএস রিসোর্স অ্যাডাপ্টার ব্যবহার করছিলাম এবং আমার সার্ভার.এক্সএমএলে ইতিমধ্যে imsudbJXA.rar এর জন্য রিসোর্স অ্যাডাপ্টার ছিল। আমি যখন imsudbXA.rar এর জন্য নতুন অ্যাডাপ্টার যুক্ত করেছি, তখন DLIException, IMSConnectionSpec বা SQLInterationSpec এর উদাহরণস্বরূপ বস্তুর জন্য আমি এই ত্রুটিটি পেতে শুরু করব। আমি বুঝতে পারি না কেন তবে আমি কেবল imsudbXA.rar ব্যবহার করে আমার কাজের জন্য নতুন সার্ভার.এক্সএমএল তৈরি করে এটি সমাধান করেছি। আমি নিশ্চিত যে সার্ভার.একএমএমএলগুলিতে একাধিক রিসোর্স অ্যাডাপ্টার ব্যবহার করা ঠিক আছে, এটি সন্ধানের জন্য আমার হাতে সময় নেই।


-1

জাভা রানটাইমের সময় A ক্লাস সন্ধান করতে অক্ষম ছিল। ক্লাস এ একটি ভিন্ন কর্মক্ষেত্র থেকে খাঁটি প্রকল্প আর্টক্লিয়েন্টে ছিল। তাই আমি আমার এক্লিপস প্রকল্পে আর্টক্লিয়েন্ট আমদানি করেছি। আমার দুটি প্রকল্প আর্টক্লিয়েন্টকে নির্ভরতা হিসাবে ব্যবহার করছিল। আমি এইগুলির জন্য প্রকল্পের রেফারেন্সে লাইব্রেরি রেফারেন্স পরিবর্তন করেছি (বিল্ড পাথ -> বিল্ড পাথ কনফিগার করুন)।

আর সমস্যা চলে গেল।


-1

আমার একই সমস্যা ছিল, এবং আমি অনেক ঘন্টা স্টক ছিল।

আমি সমাধান খুঁজে পেয়েছি। আমার ক্ষেত্রে এটির কারণে স্থিতিশীল পদ্ধতিটি সংজ্ঞায়িত হয়েছিল। জেভিএম class শ্রেণির আর একটি অবজেক্ট তৈরি করতে পারে না।

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

private static HttpHost proxy = new HttpHost(proxyHost, Integer.valueOf(proxyPort), "http");

-6

এসআরসি লাইব্রেরি থেকে দুটি ফাইল অপসারণ করার পরে আমি এই বার্তাটি পেয়েছি এবং এগুলি আবার ফিরিয়ে আনলে আমি এই ত্রুটি বার্তাটি দেখতে থাকি।

আমার সমাধানটি ছিল: পুনরায় সূচনা Eclipse। তার পর থেকে আমি আর এই বার্তাটি দেখিনি :-)


4
এটি সর্বাধিক ভোট দেওয়া উত্তরের মাধ্যমে ব্যাখ্যা করা হয়েছে, যখন আপনি প্রথম সংকলন করেছিলেন, ফাইলগুলি সেখানে ছিল, তখন আপনি কিছু ফাইল সরিয়েছিলেন, ক্লাসগুলি মুছে ফেলা হয়েছিল, তাই রানটাইমের সময় আপনি ক্লাসনটফাউন্ড পেয়েছিলেন, তবে আপনি তাদের ফিরিয়ে নিয়েছিলেন, তবে এখনও গ্রহনটি হয়নি cl খেয়াল করুন যাতে উত্পন্ন ক্লাসগুলি এখনও নিখোঁজ ছিল, তবে আপনি পুনরায়গ্রহণ শুরু করার পরে, কর্মক্ষেত্রটি সতেজ করা হয়েছিল এবং ক্লাসগুলি আবার উপলব্ধ ছিল, তবে সাধারণভাবে এটি কোনও সমাধান বা কাজ নয়, সমাধানটি খুঁজে পাচ্ছে যে রানটাইমে কোন শ্রেণি / জারটি অনুপস্থিত রয়েছে the ক্লাসপাথ।
হোসে ম্যানুয়েল গোমেজ আলভারেজ

-7

এতে module:appএবং এর সাথে মেলে কিনা তা নিশ্চিত করুন module:lib:

android {
    compileSdkVersion 23
    buildToolsVersion '22.0.1'
    packagingOptions {
    }

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 11
        versionName "2.1"
    }

3
আপনার সমাধান এই সাধারণ সমস্যার সাথে কোনওভাবেই কী প্রাসঙ্গিক?
তাবি ইল্ভস

নমুনা কনফিগারেশন সুষম নয় (তিন {sএবং দুটি })) আপনি এটা ঠিক করতে পারবো?
পিটার মর্টেনসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.