Bagaimana cara mengatasi java.lang.NoClassDefFoundError?

221

Saya sudah mencoba kedua contoh di Tutorial Java Oracle . Keduanya mengkompilasi dengan baik, tetapi pada saat run-time, keduanya menemukan kesalahan ini:

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

Saya pikir saya mungkin memiliki Main.javafile di folder yang salah. Berikut adalah hierarki direktori:

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

Dan di sini adalah 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);
    }
}

Apa yang saya lakukan salah di sini?

MEMPERBARUI

Setelah saya memasukkan Mainkelas ke dalam graphicspaket (saya menambahkannya package graphics;), mengatur classpath ke "_test" (folder yang berisi grafik), mengkompilasinya, dan menjalankannya menggunakan java graphics.Main(dari baris perintah), itu berhasil.

SANGAT terbaru UPDATE # 2

Saya tidak menggunakan Eclipse (hanya Notepad ++ dan JDK), dan pembaruan di atas menyelesaikan masalah saya. Namun, tampaknya banyak dari jawaban ini untuk Eclipse dan IntelliJ, tetapi mereka memiliki konsep yang sama.

Jonathan Lam
sumber
1
Melihat kelas utama Anda, itu tidak ada dalam paket (Anda akan ada package graphics;di atas). Apakah graphicskepala struktur paket Anda? Apakah Square ada package graphics.shapesdi atas?
Lreeder
1
Anda mendaftar di mana file .java berada, tetapi karena apa yang Anda dapatkan adalah masalah runtime , apa yang sebenarnya Anda minati adalah di mana file .class berada dan apakah mereka ada di classpath Anda atau tidak. Bagaimana Anda menjalankan kelas Utama?
Thor84no
Cukup tekan Shift + ctrl + o dalam gerhana untuk mengatur impor Anda
happybuddha
Pastikan Anda mengetikkan nama kelas dengan benar. Saya mendapatkan kesalahan ini karena saya tidak memulai nama kelas dengan huruf besar
Jeremy Borg
Ini kadang-kadang terjadi di IntelliJ IDEA setelah refactoring besar. Klik kanan pada proyek Anda dan pilih -> Compile Module , dan kemudian mulai kembali proyek dan itu akan bekerja lagi.
Zar

Jawaban:

223

Setelah Anda mengkompilasi kode Anda, Anda berakhir dengan .classfile untuk setiap kelas di program Anda. File-file biner ini adalah bytecode yang diterjemahkan oleh Java untuk menjalankan program Anda. The NoClassDefFoundErrormenunjukkan bahwa classloader (dalam hal ini java.net.URLClassLoader), yang bertanggung jawab untuk kelas dinamis pemuatan, tidak dapat menemukan .classfile untuk kelas yang Anda mencoba untuk menggunakan.

Kode Anda tidak akan dikompilasi jika kelas yang diperlukan tidak ada (kecuali kelas dimuat dengan refleksi), jadi biasanya pengecualian ini berarti bahwa classpath Anda tidak termasuk kelas yang diperlukan. Ingat bahwa classloader (khusus java.net.URLClassLoader) akan mencari kelas-kelas dalam paket abc di folder a / b / c / di setiap entri di classpath Anda. NoClassDefFoundErrorjuga dapat menunjukkan bahwa Anda kehilangan ketergantungan transitif dari file .jar yang telah Anda kompilasi dan Anda coba gunakan.

Misalnya, jika Anda memiliki kelas com.example.Foo, setelah kompilasi Anda akan memiliki file kelas Foo.class. Katakan misalnya direktori kerja Anda .../project/. File kelas itu harus ditempatkan .../project/com/example, dan Anda akan mengatur classpath Anda .../project/.

Catatan: Saya akan merekomendasikan mengambil keuntungan dari tooling luar biasa yang ada untuk bahasa Java dan JVM. IDE modern seperti Eclipse dan IDEA dan membangun alat manajemen seperti Maven atau Gradle akan membantu Anda tidak perlu khawatir tentang jalur kelas (sebanyak) dan fokus pada kode! Yang mengatakan, tautan ini menjelaskan cara mengatur classpath ketika Anda mengeksekusi di baris perintah.

Samuel
sumber
Saya membaca ini karena kesalahan yang saya temui ketika mencoba menjalankan unit test di Android. Ternyata NoClassDefFoundError, dalam kasus saya, terjadi sebagai akibat dari hilangnya dependensi dalam pengujian. Saya perlu memikirkan injeksi ketergantungan untuk mencegah kesalahan seperti ini. Terima kasih atas jawaban yang terperinci.
khas danny
130

Saya ingin mengoreksi perspektif orang lain NoClassDefFoundError.

NoClassDefFoundError dapat terjadi karena beberapa alasan seperti

  1. ClassNotFoundException - .class tidak ditemukan untuk kelas yang direferensikan terlepas dari apakah itu tersedia pada waktu kompilasi atau tidak (yaitu kelas dasar / anak).
  2. File kelas berada, tetapi Pengecualian muncul saat menginisialisasi variabel statis
  3. File kelas berada, Pengecualian muncul saat menginisialisasi blok statis

Dalam pertanyaan awal, ini adalah kasus pertama yang dapat diperbaiki dengan mengatur CLASSPATH ke file jar kelas referensi atau ke folder paketnya.

Apa artinya dengan mengatakan "tersedia dalam waktu kompilasi"?

  • Kelas referensi digunakan dalam kode.
    Misalnya: Dua kelas, A dan B (meluas A). Jika B direferensikan langsung dalam kode, itu tersedia pada waktu kompilasi, yaitu A a = new B ();

Apa artinya dengan mengatakan "tidak tersedia pada waktu kompilasi"?

  • Kelas waktu kompilasi dan kelas runtime berbeda, misalnya kelas dasar misalnya dimuat menggunakan classname kelas anak misalnya Class.forName ("classname")
    Mis: Dua kelas, A dan B (memanjang A). Kode memiliki
    A a = Class.forName ("B"). NewInstance ();
p1nkrock
sumber
Dalam kasus saya, saya telah menyusun kelas, mereka memindahkannya ke direktori yang disebut aplikasi. Saya harus menambahkan baris dengan package app;dan mengkompilasi ulang sebelum saya bisa memindahkannya ke aplikasi subdirektori.
taco
1
Terlepas dari 3 yang terdaftar di atas, ClassLoaders juga dapat menyebabkan kesalahan seperti itu, yang pada dasarnya adalah ClassNotFoundException, dalam skenario ini kelas dapat hadir dalam classpath tetapi berusaha memuat dari ClassLoader yang berbeda
Fahad
2 dan 3 khusus untuk classloader. Menurut javadoc, pengecualian hanya dimaksudkan untuk alasan 1.
Samuel
1
Saya telah menguji case 2 dan case 3, ini bukan NoClassDefFoundError, itu ExceptionInInitializerError Case 2. File class terletak, tetapi Exception dinaikkan ketika menginisialisasi variabel statis Case 3. File class terletak, Exception dinaikkan ketika menginisialisasi blok statis
Michael
1
@Michael, Tautan ini mengatakan bahwa stacktrace Anda juga akan ditampilkan NoClassDefFoundErroruntuk kasus itu: archive.is/YPbYI#selection-2107.0-2115.13
Pacerier
15

NoClassDefFoundErrorberarti bahwa kelas hadir di classpath di Compile time, tetapi tidak ada di classpath di Runtime.

Jika Anda menggunakan Eclipse, pastikan Anda memiliki entri shapes, linepointsdan spaceobjectssebagai dalam .classpathfile.

Konstantin Yovkov
sumber
1
Bagaimana cara mengatasinya dalam runtime melalui try / catch ?
Maveň ツ
5
Jawaban ini tidak benar dengan cara Anda menulisnya. Benar adalah: "SATU penyebab kemungkinan kesalahan ini adalah ...." Tetapi mungkin ada alasan lain mengapa Anda mendapatkan kesalahan ini misalnya ketika memuat file JAR saat runtime dengan classloader.
Elmue
13

jika Anda mendapatkan salah satu kesalahan ini saat mengompilasi dan menjalankan:

* 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)

-------------------------- SOLUSI -----------------------

masalahnya sebagian besar dalam organisasi paket. Anda harus mengatur kelas Anda di folder dengan benar terkait dengan klasifikasi paket dalam kode sumber Anda.

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]
sami
sumber
"-D." dalam perintah javac melakukan triknya, membuat struktur folder paket alih-alih meletakkan semua file .class pada direktori root, terima kasih!
Jorge Sampayo
9
java.lang.NoClassDefFoundError

menunjukkan, bahwa sesuatu ditemukan pada compiletime tetapi tidak pada saat runtime . mungkin Anda hanya perlu menambahkannya ke classpath.

sschrass
sumber
15
Bagaimana cara melakukannya?
Narendra Singh
tergantung pada konteks yang Anda minta.
sschrass
6

Tidak Ada Pengecualian Definisi Kelas terjadi ketika kelas yang dimaksud tidak ditemukan di Jalur Kelas. Pada Kelas Waktu Kompilasi: Kelas dihasilkan dari Java Compiler, Tetapi bagaimanapun juga pada Waktu Jalankan Kelas Tanggungan tidak ditemukan.

Mari kita pergi melalui satu Contoh Sederhana:

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";
 }
}

Sekarang mari kita asumsikan bahwa dua kode sumber Java di atas ditempatkan di beberapa folder, katakanlah "NoClassDefinationFoundExceptionDemo"

Sekarang buka shell (Misalkan Java sudah diatur dengan benar)

  1. Buka Folder "NoClassDefinationFoundExceptionDemo"
  2. Kompilasi Java Source Files javac ClassB javac ClassA
  3. Kedua file dikompilasi dengan sukses dan menghasilkan file-file kelas dalam folder yang sama dengan ClassA.class dan ClassB.class
  4. Sekarang Karena kita mengarahkan ClassPath ke direktori kerja saat ini maka kita jalankan perintah java -cp berikut . Kelas A dan Berhasil, Anda akan melihat Output di layar
  5. Sekarang Katakanlah, Anda menghapus file ClassB.class dari Present Directory. dan sekarang Anda menjalankan perintah lagi. java -cp. ClassA Sekarang akan menyambut Anda dengan NoClassDefFoundException. sebagai ClassB yang merupakan ketergantungan untuk ClassA tidak ditemukan di classpath (yaitu direktori kerja yang ada).
bharatj
sumber
5

NoClassDefFoundError di Java:

Definisi:

NoClassDefFoundError akan datang jika kelas hadir selama waktu kompilasi tetapi tidak tersedia di java classpath selama runtime. Biasanya Anda akan melihat baris log di bawah ini ketika Anda mendapatkan NoClassDefFoundError: Pengecualian di utas "utama" java.lang.NoClassDefFoundError

Kemungkinan penyebab:

  1. Kelas tidak tersedia di Java Classpath.

  2. Anda mungkin menjalankan program Anda menggunakan perintah jar dan kelas tidak didefinisikan dalam atribut ClassPath file manifes.

  3. Skrip start-up apa pun mengesampingkan variabel lingkungan Classpath.

  4. Karena NoClassDefFoundError adalah subkelas dari java.lang.LinkageError, ia juga dapat muncul jika salah satu ketergantungannya seperti perpustakaan asli mungkin tidak tersedia.

  5. Periksa java.lang.ExceptionInInitializerError di file log Anda. NoClassDefFoundError karena kegagalan inisialisasi statis cukup umum.

  6. Jika Anda bekerja di lingkungan J2EE selain visibilitas Kelas di antara beberapa Classloader juga dapat menyebabkan java.lang.NoClassDefFoundError, lihat contoh dan bagian skenario untuk diskusi terperinci.

Kemungkinan Resolusi:

  1. Verifikasi bahwa semua kelas Java yang diperlukan termasuk dalam classpath aplikasi. Kesalahan paling umum adalah tidak menyertakan semua kelas yang diperlukan, sebelum mulai menjalankan aplikasi Java yang memiliki ketergantungan pada beberapa perpustakaan eksternal.

  2. Classpath aplikasi sudah benar, tetapi variabel lingkungan Classpath diganti sebelum eksekusi aplikasi.

  3. Verifikasi bahwa ExceptionInInitializerError yang disebutkan di atas tidak muncul di jejak tumpukan aplikasi Anda.

Sumber:

3 cara untuk mengatasi java.lang.NoClassDefFoundError di Java J2EE

java.lang.NoClassDefFoundError - Bagaimana mengatasi No Class Def Found Error

Affy
sumber
3

Jika proyek Anda dalam paket seperti com.blahcodedan kelas Anda dipanggil Main, file yang dikompilasi dapat berupa output dalam struktur direktori seperti ./out/com/blahcode/Main.class. Ini terutama berlaku untuk IntelliJ IDEA.

Saat mencoba menjalankan dari shell atau cmd, Anda perlu cdke apa yang berisi comsebagai sub-direktori.

cd out
java -classpath . com.blahcode.Main
Hypershadsy
sumber
1

Setelah mengerjakan proyek NetBeans selama berbulan-bulan, saya tiba-tiba mendapat pesan NoClassDefFoundError tak lama setelah mendapatkan peringatan "Memori Rendah". Melakukan pembangunan kembali yang bersih tidak membantu, tetapi menutup Netbeans sama sekali dan membuka kembali proyek tidak ada laporan kesalahan.

Ed S
sumber
1

Jawaban ini khusus untuk java.lang.NoClassDefFoundError yang terjadi di layanan :

Tim saya baru-baru ini melihat kesalahan ini setelah memutakhirkan rpm yang menyediakan layanan. RPM dan perangkat lunak di dalamnya telah dibangun dengan Maven, jadi sepertinya kami memiliki ketergantungan waktu kompilasi yang baru saja tidak dimasukkan ke dalam rpm.

Namun, ketika menyelidiki, kelas yang tidak ditemukan berada di modul yang sama dengan beberapa kelas di jejak tumpukan. Selain itu, ini bukan modul yang baru saja ditambahkan ke build. Fakta-fakta ini menunjukkan itu mungkin bukan masalah ketergantungan Maven.

Solusi akhirnya: Mulai ulang layanan!

Tampaknya pemutakhiran rpm membatalkan penanganan file layanan pada file jar yang mendasarinya. Layanan kemudian melihat kelas yang belum dimuat ke dalam memori, mencarinya di antara daftar pegangan file jar, dan gagal menemukannya karena pegangan file yang dapat memuat kelas dari telah dibatalkan. Restart layanan memaksanya untuk memuat ulang semua file menangani, yang kemudian memungkinkannya memuat kelas yang belum ditemukan dalam memori tepat setelah peningkatan rpm.

Semoga kasus tertentu membantu seseorang.

John Chesshir
sumber
1

Saya menghadapi masalah hari ini. Saya memiliki proyek Android dan setelah mengaktifkan multidexproyek tidak akan mulai lagi.

Alasannya adalah karena saya lupa memanggil metode multidex spesifik yang harus ditambahkan ke Application classdan dipanggil sebelum yang lainnya.

 MultiDex.install(this);

Ikuti tutorial ini untuk mengaktifkan multidex dengan benar. https://developer.android.com/studio/build/multidex.html

Anda harus menambahkan baris ini ke kelas Aplikasi Anda

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

Untuk proyek saya, yang memecahkan masalah adalah browser Chrome dan chrome tidak kompatibel. Saya memiliki versi driver yang sangat lama yang bahkan tidak dapat membuka browser. Saya baru saja mengunduh versi terbaru keduanya dan masalah terpecahkan. Bagaimana saya menemukan masalah ini? Karena saya menjalankan proyek saya menggunakan driver firefox Selenium asli dengan FF versi lama yang disertakan dengan aplikasi saya, saya kemudian menyadari bahwa masalahnya adalah ketidakcocokan antara browser dan driver.

Semoga ini bisa membantu siapa saja dengan masalah serupa dengan saya, yang menghasilkan Pesan Kesalahan yang sama ini.

Kyon Perez
sumber
0

Dua sen saya dalam rantai ini:

Pastikan classpath berisi path lengkap ( /home/user/lib/some_lib.jarbukan ~/lib/some_lib.jar) jika tidak Anda masih bisa menghadapi NoClassDefFoundErrorkesalahan.

khkarens
sumber
Ini benar sebagian, tetapi lebih rumit. 1) Anda dapat menggunakan path relatif di classpath, tetapi path tersebut harus dapat diatasi oleh JVM ... relatif terhadap direktori JVM saat ini. Ini membuat mereka rapuh . 2) Anda dapat menggunakan ~dan karakter meta shell lainnya saat mengatur variabel lingkungan classpath, tetapi hanya menyediakan mekanisme yang Anda gunakan untuk mengatur variabel untuk memperluasnya ke nama path nyata. Jika Anda menggunakan bash, Anda bisa mendapatkan hasil "campur". Misalnya, lihat apa yang Anda dapatkan saat mengetik echo ~:~di baris perintah. Yang pertama ~diperluas, tetapi yang kedua tidak.
Stephen C
0

Saya mendapatkan NoClassFoundError ketika kelas yang dimuat oleh kelas runtime tidak dapat mengakses kelas yang sudah dimuat oleh java rootloader. Karena pemuat kelas yang berbeda berada dalam domain keamanan yang berbeda (menurut java), jvm tidak akan mengizinkan kelas yang sudah dimuat oleh rootloader untuk diselesaikan dalam ruang alamat pemuat runtime.

Jalankan program Anda dengan 'java -javaagent: tracer.jar [YOUR java ARGS]'

Ini menghasilkan output yang menunjukkan kelas yang dimuat, dan loader env yang memuat kelas. Sangat membantu melacak mengapa kelas tidak dapat diselesaikan.

// 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;
            }
        });
    }
}
codeDr
sumber
0

Itu terjadi pada saya di Android Studio.

Solusi yang berhasil bagi saya: cukup restart studio.

yanish
sumber
0

Saya memiliki masalah yang sama dengan pengembangan Android saya menggunakan Android studio. Solusi yang diberikan bersifat umum dan tidak membantu saya (setidaknya untuk saya). Setelah berjam-jam penelitian saya menemukan solusi berikut dan dapat membantu pengembang android yang melakukan pengembangan menggunakan android studio. ubah pengaturan seperti di bawah ini Preferensi -> Bangun, Eksekusi, Penempatan -> Jalankan Instan -> hapus centang pada opsi pertama.

Dengan perubahan ini saya bangun dan berjalan. Semoga ini bisa membantu teman-teman ibuku.

topeng
sumber
0

Salah satu sumber kesalahan untuk pengecualian ini dapat berasal dari definisi yang tidak konsisten untuk Proguard, misalnya yang hilang

-libraryJars "path.to.a.missing.jar.library".

Ini menjelaskan mengapa kompilasi dan menjalankan berfungsi dengan baik, mengingat bahwa toples ada di sana, sementara pembersihan & pembuatan gagal. Ingatlah untuk mendefinisikan pustaka jar yang baru ditambahkan dalam pengaturan proguard!

Perhatikan bahwa pesan kesalahan dari Proguard benar-benar tidak memenuhi standar, karena mereka mudah bingung dengan pesan semut yang sama yang datang ketika toples tidak ada sama sekali. Hanya di bagian paling bawah akan ada sedikit proguard dalam kesulitan. Oleh karena itu, cukup logis untuk mulai mencari kesalahan classpath tradisional dll, tetapi ini akan sia-sia.

Jelas, pengecualian NoClassDefFound akan menjadi hasil ketika menjalankan mis. Jar yang dapat dieksekusi yang dihasilkan dibangun dan didasarkan pada kurangnya konsistensi proguard. Beberapa menyebutnya proguard "Neraka"

carl
sumber
0

Saya menggunakan plugin FileSync untuk Eclipse sehingga saya dapat melakukan debug langsung pada Tomcat & saya terima NoClassFoundErrorkarena saya telah menambahkan entri sinkronisasi untuk bindirektori di ruang kerja Eclipse => classesdi metadatauntuk Tomcat tetapi tidak juga menambahkan sinkronisasi folder untuk extlibdirektori di Eclipse=>

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

Stuart Cardall
sumber
0

Saya sedang mengembangkan aplikasi berbasis Eclipse yang juga dikenal sebagai RCP (Rich Client Platform) . Dan saya telah menghadapi masalah ini setelah refactoring (memindahkan satu kelas dari plugIn ke yang baru).

Membersihkan proyek dan pembaruan Maven tidak membantu.

Masalahnya disebabkan oleh Bundle-Activator yang belum diperbarui secara otomatis. Pembaruan manual dari Bundle-Activator di bawah MANIFEST.MF di PlugIn baru telah memperbaiki masalah saya.

Aleksandr Khomenko
sumber
0

jika Anda baru saja menambahkan dukungan multidex di android studio seperti ini:

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

jadi solusi Anda hanya memperpanjang Dari MultiDexApplication bukan Aplikasi

public class MyApp extends MultiDexApplication {
lakukan01
sumber
0

Jika Anda menggunakan lebih dari satu modul, Anda harus memilikinya

dexOptions {
    preDexLibraries = false
}

di file build Anda.

Matin Petrulak
sumber
0

Periksa apakah Anda memiliki penangan statis di kelas Anda. Jika demikian, harap berhati-hati, karena pengendali statis hanya dapat diinisiasi di thread yang memiliki looper, crash dapat dipicu dengan cara ini:

1. pertama, buat instance kelas dalam utas sederhana dan tangkap crash.

2.Kemudian panggil metode bidang Class di utas utama, Anda akan mendapatkan NoClassDefFoundError.

di sini adalah kode tes:

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

dalam metode utama aktivitas onCrete Anda, tambahkan bagian kode uji:

@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
}

ada cara sederhana untuk memperbaikinya menggunakan handlerThread untuk init handler:

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

Jangan gunakan kelas tes di luar modul

Saya tidak punya solusi, hanya rasa lain dari "hadir pada saat kompilasi, absen pada saat run time".

Saya mencoba menggunakan metode yang sangat nyaman dari kelas uji JUnit dari kelas tes lain yang berada di modul yang berbeda. Itu tidak boleh, karena kode tes bukan bagian dari toples yang dikemas, tetapi saya tidak menyadarinya karena tampaknya dapat dilihat oleh kelas pengguna dari dalam Eclipse.

Solusi saya adalah menempatkan metode di kelas utilitas yang ada yang merupakan bagian dari kode produksi.

manuelvigarcia
sumber
0

Di lingkungan saya, saya menghadapi masalah ini dalam unit test. Setelah menambahkan satu ketergantungan perpustakaan ke * .pom, itu diperbaiki.

misalnya:

pesan eror:

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

pom:

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>
Mystic Lin
sumber
0

Saya mendapatkan kesalahan ini setelah perubahan cabang Git. Untuk kasus spesifik Eclipse, ada baris yang terlewatkan pada direktori .settings untuk file org.eclipse.wst.common.component. Seperti yang Anda lihat di bawah

Mengembalikan dependensi proyek dengan Maven Install akan membantu.

masukkan deskripsi gambar di sini

Leonardo
sumber
0

jika Anda menggunakan gradlew, buka ./gradle/wrapper/gradle-wrapper.propertiesdan ubahdistributionUrl ke versi gradel yang benar.

Jika Anda menggunakan JDK14, cobalah

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

Ini sering terjadi dengan perangkat genymotion saya. Pastikan Anda memiliki jumlah memori yang cukup pada drive Anda tempat Genymotion diinstal.

Totteire
sumber
Apakah Anda punya referensi untuk itu?
Wai Ha Lee
Tidak, saya hanya kehabisan ruang disk secara teratur dan kecuali saya membebaskan jumlah yang baik + menghapus / menginstal ulang perangkat virtual Genymotion saya terus mendapatkan kesalahan ini.
Totteire