java.lang.NoClassDefFoundError: XXX ক্লাস শুরু করতে পারেনি


164
public class PropHolder {
  public static Properties prop;

  static {
    //code for loading properties from file
  }
}

// Referencing the class somewhere else:
Properties prop = PropHolder.prop;

class PropHolderআমার নিজের একটি ক্লাস। ক্লাসটি মূল শ্রেণীর একই জেআর ফাইলটিতে থাকে। সুতরাং এটি হওয়া উচিত নয় কারণ কোনও জেআর ক্লাসপথ থেকে অনুপস্থিত।

আমি যখন এর মাধ্যমে জেআর ফাইলটি সন্ধান করি তখন আমি সেখানে তালিকাবদ্ধ তালিকা jar tf myjarfileদেখতে পারি PropHolder.class

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

কি সমস্যা হতে পারে?


ক্লাস প্যাকেজের সাথে মেলে আপনার জারে উপযুক্ত ডিরেক্টরি কাঠামোটি কি?
জন বি

কিছু উত্স দেখার দরকার, অনেক কিছুই এর কারণ হতে পারে। উদাহরণস্বরূপ, একটি 'প্যাকেজ' বিবৃতি তবে ফাইলটি আসলে সম্পর্কিত পথে বাস করছে না
jcomeau_ictx

3
আরম্ভের সময় একটি কারণ ব্যতিক্রম - অন্য কোনও ত্রুটি আউটপুট আছে?
মাইকেল ব্রুয়ার-ডেভিস

উত্তর:


209

আমার সেরা বেট এখানে একটি সমস্যা আছে:

static {
    //code for loading properties from file
}

এটি প্রদর্শিত হবে কিছু অযৌক্তিক ব্যতিক্রম ঘটেছে এবং ক্লাস লোড করার চেষ্টা করে আসল ClassLoader পর্যন্ত প্রচারিত হবে। এটি নিশ্চিত করার জন্য আমাদের একটি স্ট্যাকট্রেস লাগবে।

হয় বা এটি PropHolder.propস্ট্যাটিক ভেরিয়েবল তৈরি করার সময় ঘটেছিল ।


আমি বারবার একই সমস্যার মুখোমুখি হয়েছি। আমি নিশ্চিত যে এটি staticইস্যুটির কারণেই । সমস্যা সমাধানের জন্য কী করা দরকার?
ভাইপার

1
staticব্লকটি থেকে কী ব্যতিক্রম ছোঁড়া হচ্ছে তা আপনাকে সনাক্ত করতে হবে । ডিবাগ করার জন্য এটি try/catch(Exception e)পুরো ব্লকের চারপাশে রেখে ব্যতিক্রমটি লগ করুন। আপনাকে সেই ব্যতিক্রমটি ঠিক করতে হবে। সাধারণত ব্যতিক্রম লগ করা হবে তবে শ্রেণিবদ্ধকরণের সময় এটি খুব তাড়াতাড়ি ঘটতে পারে এমনটি লগ হওয়ার পরে এটি খুঁজে পাওয়া কঠিন
জন ভিন্ট

হ্যাঁ আমি কোডটি try catchব্লক করে রেখেছি এবং এটি বলেছে Failed to initialize ClassA। আমি মনে করি এটির সমস্যা JVM। আমি আমার সিস্টেমটি পুনরায় চালু করেছি এবং তারপরে সবকিছু ঠিকঠাক হয়েছিল। আমি আমার সিস্টেমটি পুনরায় আরম্ভ না করে ভবিষ্যতে কীভাবে এই সমস্যাটি সমাধান করব এবং সরল দ্রাবণ দিয়ে সমস্যার সমাধান করব।
ভাইপার

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

জাভা যদি কোনও ত্রুটি CanNotInitializeStaticPartOfClassError বা অন্য কোনও কিছু ফেলে দেয় তবে এটি আরও সহজেই আবিষ্কারযোগ্য। তারপরে আমরা বিকাশকারী হিসাবে জানতে পারি কোথায় দেখতে হবে।
মার্টেন

125

আপনি এমন একটি পাচ্ছেন java.lang.NoClassDefFoundErrorযার অর্থ এই নয় যে আপনার ক্লাসটি অনুপস্থিত (সে ক্ষেত্রে আপনি একটি পেয়ে যাবেন java.lang.ClassNotFoundException)। ক্লাস পড়ার চেষ্টা করার সময় ক্লাস সংজ্ঞা পড়ার সময় ক্লাসলোডার একটি ত্রুটির মধ্যে পড়ে।

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


1
একটি স্পষ্টতা হ'ল NoClassDefFoundError ক্লাসনটফাউন্ডএকসেপশনকে বোঝায় না, এটি এখনও NoClassDefFoundError এর সম্ভাব্য কারণ।
জন ভিন্ট

1
বুফ যদি আপনার ক্লাসনটফাউন্ডএক্সেপশন থাকে তবে ক্লাসলোডার / কখনই ক্লাস লোড করার চেষ্টা করতে পারে না, তাই না?
jeha

4
একটি শ্রেণি অন্য শ্রেণিটি লোড করা যায় যা পাওয়া যায় নি। সেই উদাহরণটির কারণটি এখনও একটি ক্লাসনটফাউন্ডএক্সসেপশন
জন ভিন্ট

1
আমার স্পষ্ট করে দেওয়া উচিত ছিল, আমি কেবল একটি ব্যতিক্রম বোঝাতে চাইছি get কারণ ()
জন ভিন্ট

1
এটি এখানে সত্যিই সহায়ক ছিল, যেহেতু আমি প্রায় 20 মিনিট জেআর যাচাই করার জন্য ব্যয় করেছি (রিপোর্ট করা বর্গটি অন্তর্ভুক্ত) অন্তর্ভুক্ত রয়েছে। আমি যখন বুঝতে পারি যে আমি ভুল দিকে তাকাচ্ছি, আমি সহজেই বুঝতে পারি যে সম্ভবত কিছু টিকাশী শ্রেণি অনুপস্থিত এবং ভয়েলা, প্রতিবেদকটিকে ঘোষিত হয়েছিল @Stateless, তাই আমি কেবলমাত্র সম্পর্কিত নির্ভরতা যুক্ত করেছি এবং আরও এগিয়ে যেতে সক্ষম হয়েছি। বখশিশের জন্য ধন্যবাদ!
রম 237

33

NoClassDefFoundError স্ট্যাটিক ব্লকের ভিতরে কী ভুল হয়েছে সে সম্পর্কে খুব একটা ক্লু দেয় না। স্থির inside ...} সূচনা কোডটির অভ্যন্তরে সর্বদা এই জাতীয় ব্লক রাখা ভাল অনুশীলন:

static {
  try {

    ... your init code here

  } catch (Throwable t) {
    LOG.error("Failure during static initialization", t);
    throw t;
  }
}

কোটলিনে এটি কিভাবে করবেন?
মারলন

ইঙ্গিত দেওয়ার জন্য ধন্যবাদ। আমার ক্ষেত্রে আমি স্ট্যাটিক লাইনের সূচনাতে এনপিই পাচ্ছিলাম।
অভিষেক

3

আমার একই ব্যতিক্রম ছিল, আমি এভাবেই সমস্যার সমাধান করেছি:

পূর্বশর্ত:

  1. জুনিট ক্লাস (এবং পরীক্ষা), যা আরও একটি ক্লাস বাড়িয়েছিল।

  2. অ্যাপ্লিকেশন কনটেক্সটটি বসন্ত ব্যবহার করে আরম্ভ করা হয়েছিল, এটি প্রকল্পের জন্য

  3. অ্যাপ্লিকেশন প্রসঙ্গটি @ পূর্ব পদ্ধতিতে শুরু করা হয়েছিল

সমাধান:

@ বিফোরক্লাস পদ্ধতি থেকে অ্যাপ্লিকেশন প্রসঙ্গটি শুরু করুন, যেহেতু প্যারেন্ট ক্লাসের জন্যও এমন কিছু ক্লাসের প্রয়োজন ছিল যা অ্যাপ্লিকেশন প্রসঙ্গে থেকেই শুরু করা হয়েছিল।

আশা করি এটি সাহায্য করবে।


2

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


1

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

mvn -U clean  test -Dtest=path 

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

-Dxxx.version=xxxxx #sorry can't post more

হতে পারে আপনি ইতিমধ্যে এই সমস্যাটি সমাধান করেছেন, তবে এখনও আশা করি এটি একই সমস্যা পূরণকারী অন্যদের সহায়তা করবে।


আরও কী, যখন লিনাক্স মেশিনে কোডটি চালানো হয়, উপরের ত্রুটিটি অনুসরণ করুন, তখন আরও একটি সমস্যা রয়েছে: এর java.lang.ExceptionInInitializerError: nullঅর্থ হ'ল শ্রেণীবোর্ডে ক্লাসটি খুঁজে পাওয়া যায় না বা কোনটি লোড করতে জানেন না (আমার ধারণা)। আপনি কি পূরণ করেছেন?
MonkeyKing

1

আমার একই ব্যতিক্রম ছিল - তবে কেবলমাত্র ডিবাগ মোডে চলাকালীন, আমি এইভাবেই সমস্যাটি সমাধান করেছি (পুরো 3 দিন পরে): বিল্ড.gradle এ আমার ছিল: ডিফল্টকনফিগ বিভাগে "মাল্টিডেক্সএইনেবলড ট্রু" সেট।

        defaultConfig {
    applicationId "com.xxx.yyy"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 5123
    versionName "5123"
    // Enabling multidex support.
    multiDexEnabled true
}

তবে দৃশ্যত এটি যথেষ্ট ছিল না। কিন্তু যখন আমি পরিবর্তন করেছি:

public class MyAppClass  extends Application 

প্রতি:

public class MyAppClass  extends MultiDexApplication 

এটি এটি সমাধান। আশা করি এটি কাউকে সাহায্য করবে


0

আপনি যদি অ্যান্ড্রয়েড প্রকল্পে কাজ করছেন তবে নিশ্চিত হয়ে নিন যে আপনি কোনও অ্যান্ড্রয়েড ক্লাসে কোনও স্থির পদ্ধতি কল করছেন না calling আমি কেবল JUnit + মকিতো ব্যবহার করছি, তাই সম্ভবত কিছু অন্যান্য কাঠামো আপনাকে পুরোপুরি সমস্যা এড়াতে সহায়তা করতে পারে, আমি নিশ্চিত নই।

আমার সমস্যাটি Uri.parse(uriString)ইউনিট পরীক্ষার জন্য স্ট্যাটিক ইনিশিয়ালাইজারের অংশ হিসাবে কল করছিল । উরি ক্লাসটি একটি অ্যান্ড্রয়েড এপিআই, এজন্য ইউনিট পরীক্ষা বিল্ড এটি খুঁজে পেল না। আমি পরিবর্তে এই মান পরিবর্তন করেছি nullএবং সবকিছু স্বাভাবিক হয়ে গেছে went


0

আমার একই সমস্যা ছিল :java.lang.NoClassDefFoundError: com.xxx.HttpUtils ক্লাস আরম্ভ করা যায়নি

static {
    //code for loading properties from file
}

এটি পরিবেশগত সমস্যা T এর মানে হল অ্যাপ্লিকেশনটিতে থাকা বৈশিষ্ট্যগুলি ym জিমটি ভুল বা খালি!


0

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

static {
    try{
        mqttConfiguration = SpringBootBeanUtils.<MqttConfiguration>getBean(MqttConfiguration.class);
    }catch (Throwable e){
        System.out.println(e);
    }
 }

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

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