কীভাবে java.lang.NoClassDefFoundError সমাধান করবেন?


221

আমি ওরাকলের জাভা টিউটোরিয়ালগুলিতে উদাহরণ দুটিই ব্যবহার করে দেখেছি । তারা উভয়ই সূক্ষ্ম সংকলন করে, তবে রান-টাইমে উভয়ই এই ত্রুটিটি নিয়ে আসে:

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

আমি মনে করি আমার কাছে Main.javaফাইলটি ভুল ফোল্ডারে থাকতে পারে । এখানে ডিরেক্টরি শ্রেণিবিন্যাস:

graphics
 Main.java
 shapes
|    Square.java
|    Triangle.java
 linepoint
|    Line.java
|    Point.java
 spaceobjects
|    Cube.java
|    RectPrism.java

এবং এখানে Main.java:

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2,3,15);
        Line l = new Line(1,5,2,3);
        Cube c = new Cube(13,32,22);
    }
}

আমি এখানে কি ভুল করছি?

হালনাগাদ

আমি রাখো রাখো Mainমধ্যে বর্গ graphicsপ্যাকেজ (আমি যোগ package graphics;এটি), এটিকে সংকলিত (গ্রাফিক্স ফোল্ডার) "_test" করার ক্লাসপাথ সেট করুন, এবং ব্যবহার করে এটি দৌড়েjava graphics.Main (কমান্ড লাইন থেকে), এটা কাজ করে।

সত্যিই শেষ আপডেট # 2

আমি Eclipse ব্যবহার করছিলাম না (কেবল নোটপ্যাড ++ এবং জেডিকে), এবং উপরের আপডেটটি আমার সমস্যার সমাধান করেছে। যাইহোক, মনে হয় যে এই উত্তরগুলির অনেকগুলিই গ্রহন এবং ইন্টেলিজের জন্য, তবে তাদের মত ধারণা রয়েছে have


1
আপনার প্রধান শ্রেণীর দিকে তাকিয়ে, এটি কোনও প্যাকেজে নেই (আপনার package graphics;শীর্ষে থাকবে)। কি graphicsআপনার প্যাকেজ গঠন প্রধান? স্কোয়ারের package graphics.shapesশীর্ষে কি আছে ?
মুক্তিদাতা

1
আপনি জাভা ফাইলগুলি কোথায় আছেন তা তালিকাভুক্ত করছেন তবে যেহেতু আপনি যা পাচ্ছেন তা রানটাইম সমস্যা, তাই আপনি আসলে কী আগ্রহী তা হ'ল। ক্লাস ফাইলগুলি কোথায় এবং সেগুলি আপনার ক্লাসপথে রয়েছে কিনা whether আপনি কীভাবে মেইন ক্লাস চালাচ্ছেন?
Thor84no

আপনার আমদানিগুলি
সজ্জিত করার জন্য গ্রহণে

আপনি শ্রেণীর নামটি সঠিকভাবে টাইপ করেছেন তা নিশ্চিত করুন। আমি এই ত্রুটিটি পেয়েছিলাম কারণ আমি একটি বড় অক্ষর দিয়ে ক্লাসের নামটি শুরু করি নি
জেরেমি বোর্গ

এটি কখনও কখনও বড় রিফ্যাক্টরিংয়ের পরে ইন্টেলিজ আইডিইএতে ঘটে। আপনার প্রকল্পে ডান ক্লিক করুন এবং নির্বাচন করুন -> মডিউল সংকলন করুন এবং তারপরে প্রকল্পটি পুনরায় শুরু করুন এবং এটি আবার কাজ করা উচিত।
জার

উত্তর:


223

আপনি আপনার কোডটি সংকলন করার পরে, আপনি .classআপনার প্রোগ্রামের প্রতিটি শ্রেণীর জন্য ফাইলগুলি শেষ করবেন । এই বাইনারি ফাইলগুলি হ'ল বাইটকোড যা জাভা আপনার প্রোগ্রামটি সম্পাদন করার জন্য ব্যাখ্যা করে। NoClassDefFoundErrorইঙ্গিত করে যে classloader (এই ক্ষেত্রে java.net.URLClassLoader), যা পরিবর্তনশীল লোড শ্রেণীর জন্য দায়ী, খুঁজে পাচ্ছি না.class বর্গ যা আপনি ব্যবহার করতে চাইছেন তার ফাইল।

প্রয়োজনীয় কোডগুলি উপস্থিত না থাকলে (কোডগুলি প্রতিবিম্ব সহ লোড না করা হয়) আপনার কোড সংকলন করবে না, তাই সাধারণত এই ব্যতিক্রমটির অর্থ আপনার ক্লাসপাথে প্রয়োজনীয় ক্লাসগুলি অন্তর্ভুক্ত থাকে না। মনে রাখবেন যে ক্লাসলোডার (বিশেষত java.net.URLClassLoader) আপনার ক্লাসপথের প্রতিটি প্রবেশপত্রে a / b / c / ফোল্ডারে প্যাকেজ abc এর ক্লাসগুলির সন্ধান করবে। NoClassDefFoundErrorএছাড়াও আপনি ইঙ্গিত করে যে জাজার ফাইলের এমন একটি ট্রানজিটিভ নির্ভরতা অনুপস্থিত যা আপনি ব্যবহার করার চেষ্টা করছেন তাও ইঙ্গিত করতে পারে।

উদাহরণস্বরূপ, আপনার যদি ক্লাস থাকে তবে com.example.Fooসংকলনের পরে আপনার কাছে একটি ক্লাস ফাইল থাকবে Foo.class। উদাহরণস্বরূপ বলুন আপনার ওয়ার্কিং ডিরেক্টরিটি .../project/। এই শ্রেণীর ফাইলটি অবশ্যই অবশ্যই স্থাপন করা উচিত .../project/com/exampleএবং আপনি আপনার শ্রেণিপথটি সেট করে রাখবেন .../project/

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


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

130

আমি অন্যের দৃষ্টিভঙ্গি ঠিক করতে চাই NoClassDefFoundError

NoClassDefFoundError একাধিক কারণে যেমন ঘটতে পারে

  1. ClassNotFoundException -। সংকলন সময়ে উপলব্ধ কিনা তা (যেমন বেস / শিশু শ্রেণি) নির্বিশেষে lass শ্রেণিটি সেই রেফারেন্সযুক্ত শ্রেণির জন্য পাওয়া যায় নি।
  2. ক্লাস ফাইলটি অবস্থিত, তবে স্ট্যাটিক ভেরিয়েবল শুরু করার সময় ব্যতিক্রম উত্থাপিত হয়েছিল
  3. ক্লাস ফাইলটি অবস্থিত, স্ট্যাটিক ব্লকগুলির সূচনা করার সময় ব্যতিক্রম উত্থাপিত হয়েছিল

মূল প্রশ্নে এটি প্রথম ক্ষেত্রে ছিল যা ক্লাসস্প্যাথ সেট করে রেফারেন্সযুক্ত ক্লাস জার ফাইল বা এর প্যাকেজ ফোল্ডারে সংশোধন করা যায়।

"সংকলনের সময় উপলব্ধ" বলতে কী বোঝায়?

  • রেফারেন্সযুক্ত ক্লাসটি কোডে ব্যবহৃত হয়।
    উদাহরণস্বরূপ: দুটি শ্রেণি, এ এবং বি (এ প্রসারিত)। বিটিতে কোডে সরাসরি রেফারেন্স থাকলে তা সংকলনের সময়ে পাওয়া যায়, যেমন এ এ = নতুন বি ();

"সংকলনের সময় উপলভ্য নয়" বলার অর্থ কী?

  • সংকলন টাইম ক্লাস এবং রানটাইম ক্লাস পৃথক, উদাহরণস্বরূপ বেস ক্লাসটি শিশু শ্রেণীর ক্লাসের নাম ব্যবহার করে লোড করা হয় উদাহরণস্বরূপ Class.forName ("
    শ্রেণীর নাম") উদাহরণস্বরূপ: দুটি ক্লাস, এ এবং বি (এ প্রসারিত)। কোড আছে
    একটি একটি = Class.forName ( "বি") newInstance ()।

আমার ক্ষেত্রে, আমি একটি ক্লাস সংকলন করেছি, তারা এটিকে অ্যাপ নামক ডিরেক্টরিতে সরিয়ে নিয়েছে। package app;সাব-ডিরেক্টরী অ্যাপ্লিকেশনটিতে স্থানান্তরিত করার আগে আমাকে এর সাথে একটি লাইন যুক্ত করতে হয়েছিল এবং পুনরায় কম্পাইল করতে হয়েছিল।
টাকো

1
উপরের তালিকাভুক্ত 3 বাদে ক্লাসলয়েডাররাও এ জাতীয় ত্রুটি সৃষ্টি করতে পারে, যা মূলত ClassNotFoundException, এই দৃশ্যে শ্রেণিপথ উপস্থাপিত হতে পারে তবে বিভিন্ন ClassLoader থেকে লোড করার চেষ্টা করতে পারে
ফাহাদ

2 এবং 3 ক্লাসলোডার-নির্দিষ্ট। জাভাডোকের মতে, ব্যতিক্রমটি কেবলমাত্র 1 কারণে করা হয়েছে
স্যামুয়েল

1
আমি কেস 2 এবং কেস 3 পরীক্ষা করেছি, এটি 'NoClassDefFoundError নয়, এটি ExceptionInInitializerError কেস 2. ক্লাস ফাইলটি অবস্থিত, তবে ব্যতিক্রম স্থির ভেরিয়েবল কেস শুরু করার সময় উত্থাপিত হয়েছে 3. ক্লাস ফাইলটি পাওয়া গেছে, স্থির ব্লকের সূচনা করার সময় ব্যতিক্রম উত্থাপিত হয়েছিল
মাইকেল

1
@Michael, এই লিঙ্কটি বলছেন যে আপনার ক্ষেত্রে স্টেকট্র্যাস খুব দেখাবে NoClassDefFoundErrorযে ক্ষেত্রে জন্য: archive.is/YPbYI#selection-2107.0-2115.13
Pacerier

15

NoClassDefFoundErrorমানে ক্লাসটি এখানে ক্লাসপথে উপস্থিত রয়েছে তবে ক্লাসপথে Compile timeএটি উপস্থিত নেই Runtime

আপনি অন্ধকার ব্যবহার করেন, তাহলে আপনি নিশ্চিত shapes, linepointsএবং spaceobjectsএন্ট্রিগুলির যেমন .classpathফাইল।


1
কীভাবে চেষ্টা / ধরার মাধ্যমে রানটাইমে হ্যান্ডেল করবেন ?
মাভেň ツ

5
এই উত্তরটি আপনি যেভাবে লিখেছেন তা সঠিক নয়। সঠিক হবে: "এই ত্রুটির এক সম্ভাব্য কারণ হ'ল ...." তবে ক্লাস লোডারের সাথে রানটাইমের সময় একটি জেআর ফাইল লোড করার সময় আপনি এই ত্রুটিটি পাওয়ার কারণগুলিও থাকতে পারে।
এলমেউ

13

সংকলন এবং চলমান অবস্থায় যদি আপনি এই ত্রুটিগুলির একটি পেয়ে থাকেন:

* NoClassDefFoundError

* Error: Could not find or load main class hello

* Exception in thread "main" java.lang.NoClassDefFoundError:javaTest/test/hello 
(wrong name: test/hello)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

-------------------------- সমাধান -----------------------

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

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]

"-ডি।" জাভাক কমান্ডটি কৌতুকটি করে, সমস্ত .class ফাইলগুলি মূল ডিরেক্টরিতে রাখার পরিবর্তে প্যাকেজগুলির ফোল্ডার কাঠামো তৈরি করে, ধন্যবাদ!
জর্হে সাম্পায়ো

9
java.lang.NoClassDefFoundError

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


15
কিভাবে যে কি?
নরেন্দ্র সিং

আপনি যে প্রসঙ্গে জিজ্ঞাসা করছেন তার উপর নির্ভর করে।
sschras

6

কোনও শ্রেণির সংজ্ঞা ব্যতিক্রম নয়যখন উদ্দেশ্যযুক্ত শ্রেণিটি পাওয়া যায় না তখন ঘটে না। কম্পাইল টাইম ক্লাসে: জাভা সংকলক থেকে ক্লাস তৈরি করা হয়েছিল, তবে কোনওভাবে রান টাইম নির্ভরশীল শ্রেণি খুঁজে পাওয়া যায় নি।

একটি সাধারণ উদাহরণ যেতে দেয়:

public class ClassA{
public static void main(String args[]){
     //Some gibberish Code...
     String text = ClassB.getString();
     System.out.println("Text is :" + text);
}

}

public class ClassB{
    public static String getString(){
      return "Testing Some Exception";
 }
}

এখন ধরে নেওয়া যাক যে উপরের দুটি জাভা উত্স কোডটি কিছু ফোল্ডারে রাখা হয়েছে যাক "NoClassD DefinationFoundExceptionDemo" বলুন

এখন একটি শেল খুলুন (ধরে নিচ্ছেন জাভা ইতিমধ্যে সঠিকভাবে সেটআপ হচ্ছে)

  1. ফোল্ডারে "NoClassD DefinationFoundExceptionDemo" এ যান
  2. জাভা উত্স ফাইলগুলি জাভাক ক্লাসবি জাভাক ক্লাসএ সংকলন করুন
  3. উভয় ফাইলই সাফল্যের সাথে সংকলন করা হয়েছে এবং একই ফোল্ডারে ক্লাসএ.ক্লাস এবং ক্লাসবি.ক্লাসের মতো ক্লাস ফাইল তৈরি করা হয়েছে
  4. এখন যেহেতু আমরা ক্লাসপথকে বর্তমান কার্যনির্বাহী ডিরেক্টরিতে ছাড়ছি তাই আমরা নিম্নলিখিত কমান্ডটি জাভা-সিপি কার্যকর করি ute শ্রেণীকক্ষে এবং এটি সফলভাবে কাজ করেছে এবং আপনি পর্দায় আউটপুট দেখতে পাবেন
  5. এখন বলুন, আপনি বর্তমান ডিরেক্টরি থেকে ClassB.class ফাইলটি সরিয়েছেন। এবং এখন আপনি আবার কমান্ড কার্যকর। java -cp। ক্লাসএ এখন এটি NoClassDefFoundException দিয়ে আপনাকে স্বাগতম জানাবে। ক্লাসবি হিসাবে যা ক্লাসএর জন্য নির্ভরশীলতা ক্লাসপথে পাওয়া যায় না (যেমন বর্তমান কার্যনির্বাহী ডিরেক্টরি)।

5

জাভাতে NoClassDefFoundError:

সংজ্ঞা:

NoClassDefFoundError আসবে যদি সংকলনের সময় কোনও ক্লাস উপস্থিত ছিল তবে রানটাইম চলাকালীন জাভা ক্লাসপথে পাওয়া যায় না। আপনি NoClassDefFoundError পাবেন: সাধারণত আপনি লগের নীচের লাইনটি দেখতে পাবেন: "মূল" থ্রেডে ব্যতিক্রম

সম্ভাব্য কারণ:

  1. ক্লাসটি জাভা ক্লাসপথে পাওয়া যায় না।

  2. আপনি জার কমান্ড ব্যবহার করে আপনার প্রোগ্রামটি চালাচ্ছেন এবং ক্লাসটি ম্যানিফেস্ট ফাইলের ক্লাসপাথ বৈশিষ্ট্যে সংজ্ঞায়িত হয়নি।

  3. কোনও স্টার্ট-আপ স্ক্রিপ্ট ক্লাসপাথ এনভায়রনমেন্ট ভেরিয়েবলকে ওভাররাইড করে।

  4. কারণ NoClassDefFoundError java.lang.LinkageErr এর একটি সাবক্লাস, এটি যদি আসতে পারে তবে এর মধ্যে যদি কোনও নেটিভ লাইব্রেরির মতো নির্ভরতা নাও পাওয়া যায়।

  5. আপনার লগ ফাইলে java.lang.ExceptionInInitializerError জন্য পরীক্ষা করুন। স্থির সূচনা ব্যর্থতার কারণে NoClassDefFoundError বেশ সাধারণ।

  6. আপনি যদি J2EE পরিবেশে একাধিক শ্রেণীবদ্ধার মধ্যে শ্রেণীর দৃশ্যমানতার চেয়ে আরও বেশি কাজ করছেন তবে java.lang.NoClassDefFoundErrorও ঘটতে পারে, বিস্তারিত আলোচনার জন্য উদাহরণ এবং দৃশ্যাংশ দেখুন see

সম্ভাব্য রেজোলিউশন:

  1. যাচাই করে নিন যে সমস্ত প্রয়োজনীয় জাভা ক্লাসগুলি অ্যাপ্লিকেশনটির ক্লাসপথে অন্তর্ভুক্ত রয়েছে। সর্বাধিক সাধারণ ভুলটি কোনও জাভা অ্যাপ্লিকেশন চালানো শুরু করার আগে কিছু বাহ্যিক লাইব্রেরির উপর নির্ভরশীলতা অন্তর্ভুক্ত না করা।

  2. অ্যাপ্লিকেশনটির ক্লাসপাথটি সঠিক, তবে ক্লাসপাথ এনভায়রনমেন্ট ভেরিয়েবল অ্যাপ্লিকেশনটির কার্যকর হওয়ার আগে ওভাররাইড করা হয়।

  3. আপনার অ্যাপ্লিকেশনটির স্ট্যাক ট্রেসের উপরে উল্লিখিত ব্যতিক্রমী ব্যতিক্রমী আইএনআইএনটিয়ালাইজার ইরার উপস্থিত হবে না তা যাচাই করুন।

সম্পদ:

জাভা J2E.Wo J2EE- তে কোনও ক্লাসডেফফাউন্ডআরার সমাধানের 3 উপায়

java.lang.NoClassDefFoundError - কীভাবে ক্লাস ডিএফ পাওয়া যায় না ত্রুটি সমাধান করা যায়


3

যদি আপনার প্রজেক্টের মতো প্যাকেজে থাকে com.blahcodeএবং আপনার ক্লাসকে ডাকা হয় Mainতবে সংকলিত ফাইলগুলি ডিরেক্টরি ডিরেক্টরিতে যেমন আউটপুট হতে পারে ./out/com/blahcode/Main.class। এটি ইন্টেলিজ আইডিইএর জন্য বিশেষত সত্য।

যখন একটি শেল বা Cmd থেকে চালানোর চেষ্টা, আপনাকে cdযা রয়েছে comএকটি উপ-ডিরেক্টরির হিসাবে।

cd out
java -classpath . com.blahcode.Main

1

নেটবিন্স প্রকল্পে বেশ কয়েক মাস কাজ করার পরে, "লো মেমোরি" সতর্কতা পাওয়ার পরে আমি হঠাৎ NoClassDefFoundError বার্তাটি পেয়েছি। একটি পরিষ্কার পুনর্নির্মাণ করা কোনও উপকারে আসেনি, তবে নেটবিনগুলি পুরোপুরি বন্ধ করে দেওয়া এবং প্রকল্পটি পুনরায় খোলার কোনও ত্রুটির খবর নেই।


1

এই উত্তরটি একটি java.lang.NoClassDefFoundError একটি ঘটছে নির্দিষ্ট সেবা :

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

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

শেষ সমাধান: পরিষেবাটি পুনরায় চালু করুন!

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

আশা করি যে নির্দিষ্ট কেসটি কাউকে সহায়তা করবে helps


1

আমি আজ সমস্যার মুখোমুখি হয়েছি। আমার একটি অ্যান্ড্রয়েড প্রকল্প রয়েছে এবং প্রকল্পটি সক্ষম multidexকরার পরে আর আর শুরু হবে না।

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

 MultiDex.install(this);

সঠিকভাবে মাল্টিডেক্স সক্ষম করতে এই টিউটোরিয়ালটি অনুসরণ করুন। https://developer.android.com/studio/build/multidex.html

আপনার অ্যাপ্লিকেশন শ্রেণিতে এই লাইনগুলি যুক্ত করা উচিত

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

1

আমার প্রকল্পের জন্য, সমস্যাটি কী সমাধান হয়েছিল তা হ'ল ক্রোম ব্রাউজার এবং ক্রোমড্রাইভার তুলনীয় ছিল না। আমার ড্রাইভারটির একটি পুরানো সংস্করণ ছিল যা ব্রাউজারটি খুলতেও পারে না। আমি সবেমাত্র উভয়ের সর্বশেষতম সংস্করণ ডাউনলোড করেছি এবং সমস্যার সমাধান হয়েছে। আমি কীভাবে বিষয়টি আবিষ্কার করেছি? যেহেতু আমি সেলেনিয়াম নেটিভ ফায়ারফক্স ড্রাইভারকে আমার অ্যাপ্লিকেশনটির সাথে এফএফ-র একটি পুরানো সংস্করণ ব্যবহার করে চালিয়েছি, তখন বুঝতে পেরেছিলাম যে সমস্যাটি ব্রাউজার এবং ড্রাইভারের মধ্যে বেমানান।

আশা করি এটি যেহেতু আমার মতো একটি অবিস্মরণীয় সমস্যা রয়েছে তার যে কাউকে সহায়তা করতে পারে, যা এই একই ত্রুটি বার্তাটি উত্পন্ন করেছে।


0

এই চেইনে আমার দুটি সেন্ট:

ক্লাসপাথে পুরো পথ রয়েছে তা নিশ্চিত করুন ( /home/user/lib/some_lib.jarপরিবর্তে ~/lib/some_lib.jar) অন্যথায় আপনি তবুও NoClassDefFoundErrorত্রুটির মুখোমুখি হতে পারেন ।


এটি অংশে সত্য, তবে এটি আরও জটিল। 1) আপনি ক্লাসপথে আপেক্ষিক পাথগুলি ব্যবহার করতে পারেন, তবে সেগুলি অবশ্যই JVM দ্বারা সমাধান করতে হবে ... জেভিএমের বর্তমান ডিরেক্টরি সম্পর্কিত। এটি তাদের ভঙ্গুর করে তোলে । 2) ক্লাসপথ এনভায়রনমেন্ট ভেরিয়েবল সেট করার সময় আপনি এবং অন্যান্য শেল মেটা অক্ষর ব্যবহার করতে পারেন ~, তবে কেবল ভেরিয়েবল সেট করার জন্য আপনি যে পদ্ধতিটি ব্যবহার করছেন তা তাদের সত্যিকারের নামগুলিতে প্রসারিত করে। আপনি যদি ব্যবহার করেন তবে আপনি bash"মিশ্র" ফলাফল পেতে পারেন। উদাহরণস্বরূপ, echo ~:~কমান্ড লাইনে টাইপ করার পরে আপনি কী পান তা দেখুন । প্রথমটি ~প্রসারিত, তবে দ্বিতীয়টি নয়।
স্টিফেন সি

0

আমি 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;
            }
        });
    }
}

0

অ্যান্ড্রয়েড স্টুডিওতে আমার সাথে এটি ঘটেছিল।

যে সমাধানটি আমার পক্ষে কাজ করেছে: কেবল স্টুডিওটি পুনরায় চালু করুন।


0

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

এই পরিবর্তনটি নিয়ে আমি প্রস্তুত এবং দৌড়াচ্ছি। আশা করি এটি আমার দেব বন্ধুদের সহায়তা করবে।


0

এই ব্যতিক্রমটির জন্য ত্রুটির একটি উত্স প্রগার্ডের অসঙ্গতিপূর্ণ সংজ্ঞা থেকে উদ্ভূত হতে পারে, যেমন একটি অনুপস্থিত

-লিবেরিজারস "path.to.a.missing.jar.library"।

এইটি ব্যাখ্যা করে যে সংকলন এবং দৌড়াদৌড়ি কেন সূক্ষ্মভাবে কাজ করে, জারটি সেখানে রয়েছে তা দিয়ে, পরিষ্কার ও বিল্ড ব্যর্থ হয়। অগ্রসর সেটআপে নতুন যুক্ত জার লাইব্রেরি সংজ্ঞায়িত করতে ভুলবেন না!

নোট করুন যে প্রুগার্ডের ত্রুটি বার্তাগুলি সত্যিই মানসম্পন্ন নয়, কারণ জার যখন একেবারেই না থাকে তখন এগুলি অনুরূপ পিঁপড়া বার্তাগুলি সহজেই বিভ্রান্ত হয়। শুধুমাত্র খুব নীচে সমস্যার মধ্যে অগ্রসর একটি ছোট ইঙ্গিত থাকবে। সুতরাং, traditionalতিহ্যগত শ্রেণিপথ ত্রুটি ইত্যাদির সন্ধান শুরু করা বেশ যুক্তিযুক্ত, তবে এটি বৃথা যাবে।

স্পষ্টতই, NoClassDefFound ব্যতিক্রম চলমান চলাকালীন ফলাফল হবে যেমন ফলস্বরূপ নির্বাহী জারটি নির্মিত এবং অগ্রগতির ধারাবাহিকতার অভাবের ভিত্তিতে। কেউ কেউ এটিকে "জাহান্নাম" বলে ডাকে


0

আমি ব্যবহার অন্ধকার জন্য FileSync প্লাগইন তাই আমি হুল বিড়াল উপর ডিবাগ বাস ও আমি পেয়েছি করতে NoClassFoundError, কারণ আমি জন্য একটি সিঙ্ক এন্ট্রি যোগ করেছিলেন binঅন্ধকার কর্মক্ষেত্র ডিরেক্টরিতে => classesমধ্যে metadataহুল বিড়াল জন্য কিন্তু জন্য একটি ফোল্ডার সমন্বয় যোগ করা হয়েছিল extlibঅন্ধকার ডিরেক্টরিতে=>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib


0

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

প্রকল্পটি পরিষ্কার করা এবং মাভেন আপডেট কোনও উপকারে আসেনি।

সমস্যাটি বান্ডিল-অ্যাক্টিভেটরের কারণে হয়েছিল যা স্বয়ংক্রিয়ভাবে আপডেট হয়নি। নতুন প্লাগইনে MANIFEST.MF এর অধীনে বান্ডিল-অ্যাক্টিভেটরের ম্যানুয়াল আপডেট আমার সমস্যাটি স্থির করেছে।


0

যদি আপনি সম্প্রতি এ জাতীয় অ্যান্ড্রয়েড স্টুডিওতে মাল্টেডেক্স সমর্থন যুক্ত করেছেন:

// To Support MultiDex
implementation 'com.android.support:multidex:1.0.1'

সুতরাং আপনার সমাধানটি কেবল অ্যাপ্লিকেশনটির পরিবর্তে মাল্টিডেক্স অ্যাপ্লিকেশন থেকে প্রসারিত

public class MyApp extends MultiDexApplication {

0

আপনি যদি একাধিক মডিউল ব্যবহার করেন তবে আপনার থাকা উচিত

dexOptions {
    preDexLibraries = false
}

আপনার বিল্ড ফাইল


0

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

1. প্রথমত, একটি সাধারণ থ্রেডে শ্রেণীর উদাহরণ তৈরি করুন এবং ক্র্যাশটি ধরুন।

২.এছাড়া মুখ্য থ্রেডে ক্লাসের ফিল্ড পদ্ধতিটি কল করুন, আপনি NoClassDefFoundError পাবেন।

পরীক্ষার কোডটি এখানে:

public class MyClass{
       private static  Handler mHandler = new Handler();
       public static int num = 0;
}

আপনার মূল ক্রিয়াকলাপের অনক্রিট পদ্ধতিতে পরীক্ষার কোড অংশ যুক্ত করুন:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //test code start
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                MyClass myClass = new MyClass();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }).start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    MyClass.num = 3;
    // end of test code
}

হ্যান্ডলারের সাহায্যে থ্যান্ড হ্যান্ডলারটি ব্যবহার করে এটি ঠিক করার একটি সহজ উপায় রয়েছে:

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}

0

মডিউলটির বাইরে পরীক্ষা ক্লাস ব্যবহার করবেন না

আমার কাছে সমাধান নেই, "সংকলনে উপস্থিত, রান টাইমে অনুপস্থিত" কেসের আরও একটি স্বাদ।

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

আমার সমাধানটি ছিল একটি বিদ্যমান ইউটিলিটি ক্লাসে পদ্ধতিটি স্থাপন করা যা উত্পাদন কোডের অংশ is


0

আমার পরিবেশে, আমি ইউনিট পরীক্ষায় এই সমস্যাটির মুখোমুখি। * .Pom এ একটি লাইব্রেরি নির্ভরতা যুক্ত করার পরে, এটি স্থির fixed

উদাহরণ:

ভুল বার্তা:

java.lang.NoClassDefFoundError: com/abc/def/foo/xyz/Iottt

Pom:

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>

0

গিট শাখা পরিবর্তনের পরে আমি এই ত্রুটি পেয়েছি। Eclipse এর নির্দিষ্ট ক্ষেত্রে, org.eclipse.wst.common.component ফাইলের জন্য .setting ডিরেক্টরিতে মিস করা লাইন ছিল। আপনি নীচে দেখতে পারেন

মাভেন ইনস্টলের সাথে প্রকল্পের নির্ভরতা পুনরুদ্ধার করতে সহায়তা করবে।

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


0

আপনি যদি ব্যবহার করছেন তবে gradlewযান ./gradle/wrapper/gradle-wrapper.propertiesএবং পরিবর্তন করুনdistributionUrl গ্রেডেলের সঠিক সংস্করণে যান।

আপনি যদি JDK14 ব্যবহার করেন তবে চেষ্টা করুন

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip

-1

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


তার জন্য আপনার কোনও রেফারেন্স আছে?
ওয়াই হা লি

নাহ, আমি নিয়মিতভাবে ডিস্কের জায়গার বাইরে চলে যাই এবং যতক্ষণ না আমি ভাল পরিমাণ মুক্ত করি না + জেনিমোশন ভার্চুয়াল ডিভাইসটি অপসারণ / পুনরায় ইনস্টল না করে আমি এই ত্রুটিটি বজায় রেখে চলেছি।
টোটায়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.