ClassNotFoundException'ı nasıl çözerim?


106

Bir Java uygulaması çalıştırmaya çalışıyorum ancak şu hatayı alıyorum:

java.lang.ClassNotFoundException:

Kolondan sonra eksik olan sınıfın yeri gelir. Ancak, sınıf başka bir yerde olduğu için bu konumun olmadığını biliyorum. Bu sınıfın yolunu nasıl güncelleyebilirim? Sınıf yolu ile bir ilgisi var mı?


1
Eksik sınıfa sahip kavanozu sınıfa eklemelisiniz ptah
Crom

Sınıfınızın bir paketi varsa, sınıfı içeren klasöre gidin. örneğin paket paket test.abc ise, test etmeden önce klasöre gidin ve ardından java -cp yapın. test.abc.CLASSNAME (.class olmadan). Paket yoksa, sınıf içeren klasöre gidin ve java -cp deyin. SINIF ADI
İsteğe bağlı

Çalışma zamanınıza bir sınıf dağıtılmadı (örneğin, eksik jar) veya sınıf belirli bir sınıf yükleyicide görünmüyorsa, bu sorunları gidermeye yardımcı olan şu aracı kontrol edin: jhades.org
Angular University

1
Bazen bununla da karşılaşıyorum. Bu istisna, bir istisna mesajında ​​gerekli tüm içeriği belirtme kuralını açıkça ihlal etmektedir. Bir şeyi nerede aramaya çalıştığını, sınıf yolunuzda ne olduğunu belirtmelidir . Lütfen daha iyi istisna mesajları oluşturun. Sorunu çözmeye yardımcı olabilecek bilgileri aramaya zorlamayın.
masterxilo

Yanıtlar:


32

Sınıf yolunuz bozuk ( Java dünyasında çok yaygın bir sorundur).

Uygulamanızı nasıl başlattığınıza bağlı olarak -cp, MANIFEST.MF'deki Sınıf-Yol girişinize veya disk düzeninize argümanınızı revize etmeniz gerekir .


34
Tutulmaya daha spesifik olabilir misin lütfen? Ne yapmam gerek?
user2426316

24
Sorunuz daha spesifik bir cevap sağlamak için yeterli bilgi içermiyor. Bunu eklemeyi düşünün.
Thorbjørn Ravn Andersen

Bağımlılık çözümü / sürüm uyuşmazlıkları, temelde tüm programlama ortamlarında çok yaygın bir sorundur. Herhangi bir programın yaptığı her şeyin bu tür tanımları çözmek olduğunu söyleyebiliriz ... soru her zaman tanımın ne / nerede olduğu ve hangi sürümü kastettiniz?
masterxilo

2
Java dünyasının yanı sıra tüm yazılımların doğru bağımlılık sürümlerinin bulunmasını sağlamak için mücadele ettiğini vurguluyorum. Bu soruna ve olası çözümlerine örnek olarak dll-cehennem, paket yöneticileri, sürüm yöneticileri, spring boot bill of material ve docker container'lardan bahsedebilirim. Yabancı kod oranı ne kadar büyük olursa sorun o kadar büyür.
masterxilo

@masterxilo Evet, ama buradaki mutlaka sorun bu değil ve yanlış ağaca havlıyor olabilirsiniz. Söylenebilecek tek şey, sınıf yolunun bozuk olduğudur.
Thorbjørn Ravn Andersen

45

Sınıf yolu, sınıfların yükleneceği konumların listesidir.

Bu 'konumlar' dizinler veya jar dosyaları olabilir.

Dizinler için, JVM bir sınıfı yüklemek için beklenen bir modeli izleyecektir. Ben dizin varsa / myproject / sınıfları: C benim sınıf yolunda ve bir sınıf yüklemeyi dener com.mycompany.Foo bir dizin olarak adlandırılan için sınıfları dizin altında bakacağız, com o bir dizin olarak adlandırılan altında MyCompany ve son olarak bu dizinde Foo.class adlı bir dosya arayacaktır .

İkinci durumda, jar dosyaları için, o sınıf için jar dosyasını arayacaktır. Bir jar dosyası gerçekte yukarıdakine benzer bir sıkıştırılmış dizin koleksiyonudur. Bir jar dosyasını açarsanız, yukarıdaki kalıbı izleyen bir dizi dizin ve sınıf dosyası alırsınız.

Dolayısıyla, JVM, sınıf tanımını yüklemeye çalıştığında sınıfın tanımını arayarak baştan sona bir sınıf yolunu dolaşır. Örneğin, sınıf yolunda:

C: / myproject / sınıflar; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

JVM, önce dizin sınıflarına , sonra stuff.jar'a ve son olarak otherstuff.jar'a bakmaya çalışacaktır .

Bir ClassNotFoundException aldığınızda, bu, JVM'nin tüm sınıf yolunu geçtiği ve başvurmaya çalıştığınız sınıfı bulamadığı anlamına gelir. Çözüm, Java dünyasında sıklıkla olduğu gibi, sınıf yolunuzu kontrol etmektir.

Komut satırında java -cp ve ardından sınıf yolunuzu söyleyerek bir sınıf yolu tanımlarsınız . Eclipse gibi bir IDE'de, sınıf yolunuzu belirtmek için bir menü seçeneğine sahip olacaksınız.


13

Şimdiye kadar bulduğum en iyi çözüm bu.

org.mypackageSınıfları içeren bir paketimiz olduğunu varsayalım :

  • HelloWorld (ana sınıf)
  • Destek Sınıfı
  • UtilClass

ve bu paketi tanımlayan dosyalar fiziksel olarak dizin altında D:\myprogram(Windows'ta) veya /home/user/myprogram(Linux'ta) saklanır .

Dosya yapısı şöyle görünecektir: görüntü açıklamasını buraya girin

Şimdi ise Java'nın çağırmak, biz çalıştırmak için uygulamanın adını belirtin: org.mypackage.HelloWorld. Bununla birlikte, Java'ya paketimizi tanımlayan dosya ve dizinleri nerede arayacağını da söylemeliyiz. Bu yüzden programı başlatmak için aşağıdaki komutu kullanmalıyız: görüntü açıklamasını buraya girin

NOT:java Mevcut konumunuz ne olursa olsun yukarıdaki komutu yürütmelisiniz . Ancak bu durum böyle değil javac. Derlemek için doğrudan .javadosyalarınızın bulunduğu dizine gidebilir ve doğrudan çalıştırabilirsiniz javac ClassName.java.


6

Sınıfın yolunu veya sınıfı içeren jar dosyasını biliyorsanız, onu çalıştırırken sınıf yolunuza ekleyin. Sınıf yolunu burada belirtildiği gibi kullanabilirsiniz:

Windows'ta

java -classpath .;yourjar.jar YourMainClass

UNIX / Linux'ta

java -classpath .:yourjar.jar YourMainClass

4

Maven kullanıyorsanız bunları deneyin. Projem için maven kullanıyorum mvn clean installve bir programı çalıştırıp çalıştırmaya çalıştığımda istisna atıyor. Bu yüzden projeyi temizleyip tekrar çalıştırıyorum ve benim için çalışıyor.

Eclipse IDE kullanıyorum.

Junit testi çalıştırırken Sınıf Bulunamadı İstisnası için bir mvn clean testkez çalıştırmayı deneyin . Tüm test sınıflarını derleyecektir.


"mvn clean test" çalıştırdığınızda hangi dizindeydiniz? POM ile aynı dizinde mi?
TacoB0t

1
Evet. Pom dosyasının bulunduğu dizinden çalıştırdım.
Arun

3

Bir sınıfın konumunu komut satırı aracılığıyla sınıf yolunuza eklemek için, çalıştırırken basitçe -cpveya -classpathve sınıfın konumunu ekleyin . IE

java -cp "c:/location/of/file" YourProgram

Veya tutulma gibi bir IDE çalıştırıyorsanız, sağ tıklayıp project -> build path -> configure build path sınıfınızı içeren harici JAR'ı derleme yoluna ekleyebilirsiniz, o zaman iyi çalışması gerekir.


3

';' Kullanın ayırıcı olarak. Ortam değişkenleriniz doğru ayarlanmışsa, ayarlarınızı görmelisiniz. PATH ve CLASSPATH'ınız doğruysa, pencereler bu komutları tanımalıdır. Java'yı yüklerken bilgisayarınızı yeniden başlatmanıza gerek YOKTUR.


5
Bu, pencerelerde (noktalı virgül), unix /
linux'ta

3

Jar dosyasının tam yolunu CLASSPATH'a ekleyin . Linux kullanımda: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". Diğer bir yol (CLASSPATH'ı düzenlemeden) mevcut proje klasöründeki kavanozun sıkıştırmasını açmaktı.

Yollar benim için işe yaramadı:

1) -cpJar dosyasının tam yolu seçeneğinin kullanılması .

2) -cpMevcut klasörde bulunduğunda yalnızca akü adıyla kullanma

3) Jar'ı mevcut proje klasörüne kopyalama

4) Kavanozu java kavanozlarının standart konumuna kopyalamak (/ usr / share / java)

Bu çözüm, mysql-connector-java.5 - *. Jar içindeki com.mysql.jdbc.Driver sınıfı için rapor edilmiştir, OpenJDK sürüm 1.7 ile linux üzerinde çalışıyor


Sadece
JAR'ı açmak

2

En üste gidin ve varsa import ifadesini kaldırın ve sınıfı yeniden içe aktarın. Ancak durum bu değilse, temizleyip inşa edin. Netbeans veya Eclipse mi kullanıyorsunuz?


2

Bununla da karşılaştım ve diğer tüm çözümleri denedim. HTML klasörümde .class dosyası yoktu, sadece .java dosyası vardı. .Class dosyasını ekledikten sonra program iyi çalıştı.


2
  1. Sınıf yolunuz doğru değilse olabilir

  2. Aynı proje adı altında serileştirilebilir bir sınıf ve serileştirilebilir sınıftan çıkarılabilir bir sınıf belirleyelim. Belirli bir klasörde serileştirilebilir bir nesne oluşturarak serileştirilebilir sınıfı çalıştırırsınız. Şimdi eski verilere ihtiyacınız var. Bu arada projenin adını değiştirirseniz işe yaramayacaktır. Önce serileştirilebilir sınıfı çalıştırmanız ve ardından dosyanın serisini kaldırmanız gerekir.


2

Maven kullanıyorsanız, tüm projeleri güncellemeye ve anlık görüntüler için zorlamaya çalışın. O da temizleyecek ve tüm sınıf yolunu yeniden inşa edecek .. Sorunumu çözdü ..


2

daha yeni yaptım

1. Önbellekleri geçersiz kılın ve yeniden başlatın

2. Sorunu çözen projemi yeniden oluşturdu


1

ProcessClass kullanarak C # kodundan .jar çalıştırmaya çalışıyordum . Java kodu tutulmadan başarılı bir şekilde çalıştı, ancak C # görsel stüdyosundan değil ve hatta doğrudan jar dosyasına tıklandığında bile, ClassNotFoundException:istisna ile her zaman durdu . Benim için çözüm, java programını "JAR Dosyası" yerine "Çalıştırılabilir JAR dosyası" olarak dışa aktarmaktı. Umarım birine yardımcı olabilir.


1

Bu, java SDK'nın eski sürümünün eksik olduğu ve yeni bir sürümün mevcut olduğu bir java güncellemesinden sonra Windows'ta gerçekleşebilir. IDE'nizin yüklü java SDK sürümünü kullanıp kullanmadığını kontrol ederim (IntelliJ: CTRL + SHIFT + ALT + S)


1

Birden fazla (Üçüncü Taraf) ** kitaplık eklediyseniz ve Genişletmeler ** Uygulama sınıfı

O zaman ortaya çıkabilir.

Bunun için, multiDexEnabled truegenişletilmiş Applicationsınıfınızı ayarlamalı ve değiştirmelisiniz MultiDexApplication.

Çözülecek.


1

Temel Genel Soru - En Basit Genel Cevap;)

Bilgiler göz önüne alındığında, basit bir metin editörü ve bazı Komut Kabuğu kullanarak "Merhaba Dünya" gibi basit bir konsol uygulamasını kodlama, oluşturma / derleme ve çalıştırma için temel bir yaklaşım deniyor olabileceğinizi varsayacağım.

Bu hata, sonraki senaryoda ortaya çıkar:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

Başka bir deyişle, şunu kullanın:

..\SomePath>java HelloWorld

PS .class dosya uzantısının eklenmesi aynı hataya neden olur. Ayrıca, işletim sisteminin Ortam Değişkenlerinin PATH'inde Java'nın (JDK / JRE) bin klasörüne sahip olduğunuzdan emin olun. (Bu konudaki diğer gönderilere daha fazla ayrıntı için bakın) PPS Varsayımlarımda doğru muydum?


1

Eğer maven kullanıyorsanız, bu eklentinin şurada olup olmadığını kontrol edin pom.xml:

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

Bağımlılığınızı (istisna nedeni) kavanozunuza koyacaktır.

Bilginize : Bu, son kavanozda şişirilmiş tüm bağımlılıkları içerecektir


@Archit eklendi.
techkuz

0

Benim durumumda, sınıf bulunamadı istisnası olarak atılan sınıf, ssl sertifikalarıyla ilgili özelliklere sahiptir. Tutulmayı kapatın ve "Yönetici Olarak Çalıştır" olarak açın, ardından sorun çözüldü. Tutulma, konuyla ilgili izinlere sahip olduğundan, bu tür bir istisna atacaktır.


-8

Tüm kodu try bloğuna koyun ve bir catch bloğunda istisnayı yakalayın

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
Bu, istisnayı çözmez. Bu istisnayı gizler. Dahası, "e1.getmessage ()" a) getMessage () 'in yanlış büyük harf kullanımıdır ve b) mesaj içeren bir dize döndürdüğü ve onu yazdırmadığınız veya günlüğe kaydetmediğiniz için fazla bir şey yapmayacaktır!
IBBoard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.