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.java
file 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 Main
kelas ke dalam graphics
paket (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.
sumber
package graphics;
di atas). Apakahgraphics
kepala struktur paket Anda? Apakah Square adapackage graphics.shapes
di atas?Jawaban:
Setelah Anda mengkompilasi kode Anda, Anda berakhir dengan
.class
file untuk setiap kelas di program Anda. File-file biner ini adalah bytecode yang diterjemahkan oleh Java untuk menjalankan program Anda. TheNoClassDefFoundError
menunjukkan bahwa classloader (dalam hal inijava.net.URLClassLoader
), yang bertanggung jawab untuk kelas dinamis pemuatan, tidak dapat menemukan.class
file 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.NoClassDefFoundError
juga 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 kelasFoo.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.
sumber
Saya ingin mengoreksi perspektif orang lain
NoClassDefFoundError
.NoClassDefFoundError
dapat terjadi karena beberapa alasan sepertiDalam 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"?
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"?
Mis: Dua kelas, A dan B (memanjang A). Kode memiliki
A a = Class.forName ("B"). NewInstance ();
sumber
package app;
dan mengkompilasi ulang sebelum saya bisa memindahkannya ke aplikasi subdirektori.NoClassDefFoundError
untuk kasus itu: archive.is/YPbYI#selection-2107.0-2115.13NoClassDefFoundError
berarti bahwa kelas hadir di classpath diCompile time
, tetapi tidak ada di classpath diRuntime
.Jika Anda menggunakan Eclipse, pastikan Anda memiliki entri
shapes
,linepoints
danspaceobjects
sebagai dalam.classpath
file.sumber
jika Anda mendapatkan salah satu kesalahan ini saat mengompilasi dan menjalankan:
-------------------------- SOLUSI -----------------------
masalahnya sebagian besar dalam organisasi paket. Anda harus mengatur kelas Anda di folder dengan benar terkait dengan klasifikasi paket dalam kode sumber Anda.
sumber
menunjukkan, bahwa sesuatu ditemukan pada compiletime tetapi tidak pada saat runtime . mungkin Anda hanya perlu menambahkannya ke classpath.
sumber
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:
}
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)
sumber
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:
Kelas tidak tersedia di Java Classpath.
Anda mungkin menjalankan program Anda menggunakan perintah jar dan kelas tidak didefinisikan dalam atribut ClassPath file manifes.
Skrip start-up apa pun mengesampingkan variabel lingkungan Classpath.
Karena NoClassDefFoundError adalah subkelas dari java.lang.LinkageError, ia juga dapat muncul jika salah satu ketergantungannya seperti perpustakaan asli mungkin tidak tersedia.
Periksa java.lang.ExceptionInInitializerError di file log Anda. NoClassDefFoundError karena kegagalan inisialisasi statis cukup umum.
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:
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.
Classpath aplikasi sudah benar, tetapi variabel lingkungan Classpath diganti sebelum eksekusi aplikasi.
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
sumber
Jika proyek Anda dalam paket seperti
com.blahcode
dan kelas Anda dipanggilMain
, 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
cd
ke apa yang berisicom
sebagai sub-direktori.sumber
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.
sumber
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.
sumber
Saya menghadapi masalah hari ini. Saya memiliki proyek Android dan setelah mengaktifkan
multidex
proyek tidak akan mulai lagi.Alasannya adalah karena saya lupa memanggil metode multidex spesifik yang harus ditambahkan ke
Application class
dan dipanggil sebelum yang lainnya.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
sumber
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.
sumber
Dua sen saya dalam rantai ini:
Pastikan classpath berisi path lengkap (
/home/user/lib/some_lib.jar
bukan~/lib/some_lib.jar
) jika tidak Anda masih bisa menghadapiNoClassDefFoundError
kesalahan.sumber
~
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 menggunakanbash
, Anda bisa mendapatkan hasil "campur". Misalnya, lihat apa yang Anda dapatkan saat mengetikecho ~:~
di baris perintah. Yang pertama~
diperluas, tetapi yang kedua tidak.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.
sumber
Itu terjadi pada saya di Android Studio.
Solusi yang berhasil bagi saya: cukup restart studio.
sumber
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.
sumber
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"
sumber
Saya menggunakan plugin FileSync untuk Eclipse sehingga saya dapat melakukan debug langsung pada Tomcat & saya terima
NoClassFoundError
karena saya telah menambahkan entri sinkronisasi untukbin
direktori di ruang kerja Eclipse=> classes
dimetadata
untuk Tomcat tetapi tidak juga menambahkan sinkronisasi folder untukextlib
direktori di Eclipse=>
C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib
sumber
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.
sumber
jika Anda baru saja menambahkan dukungan multidex di android studio seperti ini:
jadi solusi Anda hanya memperpanjang Dari MultiDexApplication bukan Aplikasi
sumber
Jika Anda menggunakan lebih dari satu modul, Anda harus memilikinya
di file build Anda.
sumber
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:
dalam metode utama aktivitas onCrete Anda, tambahkan bagian kode uji:
ada cara sederhana untuk memperbaikinya menggunakan handlerThread untuk init handler:
sumber
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.
sumber
Di lingkungan saya, saya menghadapi masalah ini dalam unit test. Setelah menambahkan satu ketergantungan perpustakaan ke * .pom, itu diperbaiki.
misalnya:
pesan eror:
pom:
sumber
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.
sumber
jika Anda menggunakan
gradlew
, buka./gradle/wrapper/gradle-wrapper.properties
dan ubahdistributionUrl
ke versi gradel yang benar.Jika Anda menggunakan JDK14, cobalah
sumber
Ini sering terjadi dengan perangkat genymotion saya. Pastikan Anda memiliki jumlah memori yang cukup pada drive Anda tempat Genymotion diinstal.
sumber