2011-03-21 31 views
5

I Main.java denilen bir Java programı, aşağıdaki dizinde bulunur var Ben bu hattı kullanın:giderme NoClassDefFoundError Java

/home$ java /home/user/program/Main 
:

/home/user/program$ java Main 

Ama eve dizinden Main.java çalıştırmayı denediğinizdeAlıyorum:

Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main 
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main 

Bu hatanın nedeni nedir?

+0

ana sınıfın kodunu yayınlayabilir misin – GuruKulki

+0

@svrist OP işe yaradığını söylüyor. @shaw try setting path yolu java -cp/home/kullanıcı/program Ana ' – Nishant

cevap

10

Bu, geçerli dizine varsayılan olarak Sınıfyolu, kaynaklanmaktadır sağlamanız gerekir. java Main'u /home/user/program'dan çalıştırdığınızda, geçerli dizinde sınıfı bulur (paketin varsayılan olmadığı anlaşılıyor, bu varsayılan değerdir). Bu nedenle, sınıfı /home/user/program/Main.class'da bulur. /home den java /home/user/program/Main Running

paketin .home.user.program ile Main sınıfın bir tanımını içeren dosyayı Main.class bulma umuduyla /home/home/user/program görüneceğini sınıf yolunda sınıfı (geçerli dizin) bulmaya çalışır.

Ekstra detay: Ben java başlatıcısı.-Gösterimde bir classname için/-notation dönüştürerek tarafından iyi olmaya çalışıyor düşünüyorum; ve java /home/user/program/Main çalıştırdığınızda, aslında sizin için java .home.user.program.Main çalıştırıyor. Bu , bir dosya belirtme olmamalıdır, ancak tam olarak belirtilen bir sınıf adı (örneğin, paket belirteci dahil) olmamalıdır.Bir sınıf bir paket yitirdiğinde java sınıf yolunda bir dizin (veya kavanoz) içine, paket adıyla eşleşen bir dizin yapısı içinde o sınıfı bulmak bekliyor; dolayısıyla, bu sınıf dosyası için /home/home/user/program bakmak için çalışacağız

Sen -cp veya -classpath ile sınıf yolunu belirterek bunu düzeltebilirsiniz: Çünkü ben bu sonuçlandırmak söylediklerine

java -cp /home/user/program Main 
+0

teşekkürler işe yaradı! – shaw

+0

Tanımlanmış bir paketiniz varsa bunu yapmanız gerekebilir: java -cp/home/user/program :. Ana 'ekstra':. 'Ve geçerli dizin demektir. –

3

Çünkü tam adı kullanarak sınıfı arıyorsunuz (/ home/user/program/Main). Yalnızca Ana sınıfı için bak ama iyi sınıf yolunu kullanarak olmalıdır: java Ana cp/home/kullanıcı/programı

o yolları

+0

+1 aslında cevaplamak için. – Nishant

0

Sizin 2 kümesi verilen ana sınıfı arama anlamına gelir komut sürümü, sınıfları nerede bulacağını bilmiyor. Sen sözde sınıf yolu

/home$ java -cp userprogram Main 
+0

'-cp kullanıcı/program' sanırım :) – helios

+0

Sağ - home/home/kullanıcı ev dizini olarak gördüm –

0

:

  • Ana "top" (kök) paketinde ise

Ve sen, öyle, senin Pakage ve sınıflar yapı bulunduğu kök dizin sınıfyolu belirtmelidir java yürütmek zaman. Senin durumunda

çok/home/kullanıcı/programıdır. Ve sanırım dersin de "." (bulunduğunuz dir). Java'yı evden aradığınızda, sınıf yolu erroneosly olarak alınır.

package user.program; 

Ve ev/için sınıf yolunu ayarlamak (veya o dir den java yürütmek):

farklı bir paket kullanarak sizin ana aramak isterseniz

sınıfın üstündeki paketini ilan ediyoruz. Sonraki çağrı java bu şekilde:

java user.program.Main 

onun tam sınıf adı (paketleri gösterir) nedeniyle noktalar kullanarak. Bu, classpath + package + sınıfını birleştiren dizinlere çevrilir. Örneğin:

/home 
user.program -> user/program/ 
Main   -> Main.class 

İyi şanslar!

+0

bilgi için teşekkürler, bu bana bir sınıf yolunun ne anlama geldiğini anlamamı sağladı – shaw

+0

Harika! – helios

0

sorun java /home/user/program/Main ararsanız paket Main olduğunu ben Main (ı yani hiç yok, varsayılan paketinde olduğunu varsayalım) için geçerli değildir varsayalım home.user.program, olması gerekiyordu olmasıdır. Main'un üstünde package beyanı var mı?

Ben diğer yanıtlar sınıf yolu önerileri kullanmak için öneririm.

0

Bu benim için çalışıyor:

java-cp/home/kullanıcı/Program Ana

0

sadece bir süre önce (NoClassDefFoundError) ait bu tür bir hata karşılaştı. Eclipse env kullanarak benim android app bazı üçüncü parti kütüphanesi ithal. Doğru sınıf yolunda ortaya çıktı belirtilen kütüphaneye rağmen atıldı bulunamadı bu üçüncü taraf kitaplığından bazı sınıf ve bu NoClassDefFoundError bir sonucudur, bu yüzden gerçekten yapılabilir başka ne bilmiyordum - Bir çalışma zamanı sırasında bu hata var bu problemi çözmek için."Sipariş ve İhracat" "Java Build Path" içinde sekme ile oynarken , benim projedeki tüm kütüphanelerin listenin üst benim ithal üçüncü taraf kitaplığı koymak ve onay kutusunu kontrol - Bu çözüldü Sorun

0

Bu hatayı derlemeye ve çalıştırmaya çalışırken rastladım. "İlk Önce Java" adlı kitap, bu problemi uygun şekilde açıklıyor ve ele alıyor. İşte referans için kitaptan bir ekran görüntüsü.

A screenshot from Head First Java about how to compile and run a java program by including package names.

eski faydalı Umut.

İlgili konular