Yeni Java geliştiricilerinin deneyimlediği yaygın bir sorun, programlarının hata mesajıyla çalışamamasıdır: Could not find or load main class ...
Bu ne anlama geliyor, neden oluyor ve nasıl düzeltmelisiniz?
Yeni Java geliştiricilerinin deneyimlediği yaygın bir sorun, programlarının hata mesajıyla çalışamamasıdır: Could not find or load main class ...
Bu ne anlama geliyor, neden oluyor ve nasıl düzeltmelisiniz?
Yanıtlar:
java <class-name>
komut sözdizimiHer şeyden önce, java
(veya javaw
) komutunu kullanarak bir programı başlatmanın doğru yolunu anlamanız gerekir .
Normal sözdizimi 1 şudur:
java [ <options> ] <class-name> [<arg> ...]
burada <option>
komut satırı seçeneği ("-" karakteriyle başlayarak), <class-name>
tam nitelikli bir Java sınıfı adıdır ve <arg>
uygulamanıza aktarılan rastgele bir komut satırı bağımsız değişkenidir.
1 - Bu cevabın sonuna yaklaşan başka sözdizimleri de var.
Sınıfın tam adı (FQN) geleneksel olarak Java kaynak kodunda olduğu gibi yazılır; Örneğin
packagename.packagename2.packagename3.ClassName
Ancak java
komutun bazı sürümleri nokta yerine eğik çizgi kullanmanıza izin verir; Örneğin
packagename/packagename2/packagename3/ClassName
(kafa karıştırıcı olarak) bir dosya yol adı gibi görünür, ancak bir dosya adı gibi görünmez. Tam nitelikli ad teriminin standart Java terminolojisi olduğunu unutmayın ... sizi şaşırtmak için yaptığım bir şey değil :-)
İşte bir java
komutun nasıl görünmesi gerektiğine dair bir örnek :
java -Xmx100m com.acme.example.ListUsers fred joe bert
Yukarıdaki java
komutun aşağıdakileri yapmasına neden olacaktır:
com.acme.example.ListUsers
Sınıfın derlenmiş sürümünü arayın .main
yöntemi ile imza , dönüş türü ve değiştiriciler tarafından verilen public static void main(String[])
. (Yöntem bağımsız değişkeninin adı imzanın bir parçası DEĞİLDİR .)String[]
."Ana sınıf bulunamadı veya yüklenemedi ..." iletisini aldığınızda, bu ilk adımın başarısız olduğu anlamına gelir. java
Komut sınıfını bulmak mümkün değildi. Gerçekten de "..." mesajında olacak tam nitelikli sınıf adıjava
aramaktadır.
Öyleyse neden sınıfı bulamıyor?
İlk olası neden yanlış sınıf adını vermiş olabilirsiniz. (Veya ... doğru sınıf adı, ancak yanlış biçimde) Yukarıdaki örnek göz önüne alındığında , sınıf adını belirtmenin çeşitli yanlış yolları aşağıda verilmiştir:
Örnek 1 - basit bir sınıf adı:
java ListUser
Sınıf aşağıdaki gibi bir pakette bildirildiğinde , komutta paket adı da dahil olmak üzerecom.acme.example
tam sınıf adını kullanmalısınız ; Örneğinjava
java com.acme.example.ListUser
Örnek 2 - sınıf adı yerine dosya adı veya yol adı:
java ListUser.class
java com/acme/example/ListUser.class
Örnek 3 - kasa yanlış olan bir sınıf adı:
java com.acme.example.listuser
Örnek 4 - bir yazım hatası
java com.acme.example.mistuser
Örnek 5 - bir kaynak dosya adı (Java 11 veya üstü hariç; aşağıya bakın)
java ListUser.java
Örnek 6 - sınıf adını tamamen unuttun
java lots of arguments
İkinci olası neden, sınıf adının doğru olması, ancak java
komutun sınıfı bulamamasıdır. Bunu anlamak için, "sınıf yolu" kavramını anlamanız gerekir. Bu, Oracle belgeleriyle iyi açıklanmıştır :
java
komut dokümantasyonYani ... sınıf adını doğru bir şekilde belirttiyseniz, kontrol edilmesi gereken bir sonraki şey sınıf yolunu doğru bir şekilde belirttiğinizdir:
java
komutu çalıştırdığınızda geçerli olan CLASSPATH ortam değişkenine bakın . Dizin adlarının ve JAR dosya adlarının doğru olup olmadığını denetleyin.java
komutu.;
Windows ve :
diğerleri üzerindedir. Platformunuz için yanlış ayırıcı kullanırsanız, açık bir hata iletisi almazsınız. Bunun yerine, yol üzerinde sessizce yoksayılacak varolmayan bir dosya veya dizin alırsınız .)Sınıf yoluna bir dizin koyduğunuzda, bu dizin zaman zaman nitelikli ad alanının köküne karşılık gelir. Sınıflar , tam nitelikli adın bir yol adıyla eşleştirilmesiyle, bu kökün altındaki dizin yapısında bulunur . Örneğin, "/ usr / local / acme / classes" sınıf yolundaysa, JVM adlı bir sınıfı aradığında com.acme.example.Foon
, bu yol adına sahip bir ".class" dosyası arayacaktır:
/usr/local/acme/classes/com/acme/example/Foon.class
Sınıf yoluna "/ usr / local / acme / classes / com / acme / example" koymuş olsaydınız, JVM sınıfı bulamazdı.
Sınıflarınız FQN ise com.acme.example.Foon
, JVM "com / acme / example" dizininde "Foon.class" ı arayacaktır:
Dizin yapınız yukarıdaki desene göre paket adlandırma ile eşleşmiyorsa, JVM sınıfınızı bulamaz.
Bir sınıfı taşıyarak yeniden adlandırmayı denerseniz , bu da başarısız olur ... ancak istisna stacktrace farklı olacaktır. Böyle bir şey söylemekle yükümlüdür:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
çünkü sınıf dosyasındaki FQN, sınıf yükleyicinin bulmayı beklediği şeyle eşleşmiyor.
Somut bir örnek vermek gerekirse, varsayalım:
com.acme.example.Foon
ders vermek istiyorsunuz ,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,sonra:
# wrong, FQN is needed
java Foon
# wrong, there is no `com/acme/example` folder in the current working directory
java com.acme.example.Foon
# wrong, similar to above
java -classpath . com.acme.example.Foon
# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon
# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon
Notlar:
-classpath
seçenek -cp
çoğu Java sürümünde kısaltılabilir . İçin ilgili manuel girişler kontrol java
, javac
vb.Sınıf yolunun , uygulamanızın bağlı olduğu diğer (sistem dışı) sınıfların tümünü içermesi gerekir . (Sistem sınıfları otomatik olarak bulunur ve nadiren bununla ilgilenmeniz gerekir.) Ana sınıfın doğru yüklenmesi için JVM'nin şunları bulması gerekir:
(Not: JLS ve JVM spesifikasyonları, JVM'nin "tembel" sınıfları yüklemesi için bir kapsam sağlar ve bu, bir sınıf yükleyici istisnası atıldığında etkilenebilir.)
Bazen birisi kaynak kod dosyasını kaynak kod ağacındaki yanlış klasöre koyar veya package
bildirimi dışarıda bırakır . Bunu bir IDE'de yaparsanız, IDE'nin derleyicisi size derhal bunu anlatacaktır. Benzer şekilde, iyi bir Java derleme aracı kullanırsanız, araç javac
sorunu algılayacak şekilde çalışır . Ancak, Java kodunuzu el ile oluşturursanız, derleyici sorunu fark etmeyecek şekilde yapabilirsiniz ve sonuçta ortaya çıkan ".class" dosyası olmasını beklediğiniz yerde olmaz.
Kontrol edilecek çok şey var ve bir şeyi kaçırmak kolaydır. -Xdiag
Seçeneği java
komut satırına eklemeyi deneyin (sonraki ilk şey olarak java
). Sınıf yükleme ile ilgili çeşitli şeyler çıkarır ve bu size gerçek sorunun ne olduğu hakkında ipuçları verebilir.
Ayrıca, görünmez veya ASCII olmayan karakterleri web sitelerinden, belgelerden vb. Kopyalayıp yapıştırmadan kaynaklanan olası sorunları da göz önünde bulundurun. Ve "homoglifler" diyelim, iki harf ya da sembol aynı görünüyormuş ... ama değil.
Son olarak, yanlış imzaları olan bir JAR dosyasından başlatmaya çalışırsanız görünüşe göre bu sorunla karşılaşabilirsiniz (META-INF/*.SF)
.
java
Java programlarını başlatmak için üç alternatif sözdizimi vardır java command
.
1) "Yürütülebilir" JAR dosyasını başlatmak için kullanılan sözdizimi aşağıdaki gibidir:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
Örneğin
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
Giriş noktası sınıfının adı (yani com.acme.example.ListUser
) ve sınıf yolu JAR dosyasının MANIFEST'inde belirtilir.
2) Bir modülden (Java 9 ve üstü) bir uygulama başlatmak için sözdizimi aşağıdaki gibidir:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
Giriş noktası sınıfının adı ya <module>
kendisi tarafından tanımlanır ya da isteğe bağlı olarak verilir <mainclass>
.
3) Java 11'den itibaren, tek bir kaynak kod dosyasını derleyip çalıştırabilir ve aşağıdaki sözdizimiyle çalıştırabilirsiniz:
java [ <options> ] <sourcefile> [<arg> ...]
burada (tipik olarak) ".java" sonekine sahip bir dosyadır.
Daha fazla ayrıntı için, lütfen java
kullandığınız Java sürümü komutunun resmi belgelerine bakın .
Tipik bir Java IDE, Java uygulamalarının IDE JVM'nin kendisinde veya alt JVM'de çalıştırılması için desteğe sahiptir. Bunlar genellikle bu özel istisnadan etkilenmez, çünkü IDE çalışma zamanı sınıfyolunu oluşturmak, ana sınıfı tanımlamak ve java
komut satırını oluşturmak için kendi mekanizmalarını kullanır .
Bununla birlikte, IDE'nin arkasından bir şeyler yaparsanız, bu istisnanın gerçekleşmesi hala mümkündür. Örneğin, Eclipse'de Java uygulamanız için daha önce bir Uygulama Başlatıcı oluşturduysanız ve daha sonra "ana" sınıfı içeren JAR dosyasını Eclipse'e söylemeden dosya sisteminde farklı bir yere taşıdıysanız , Eclipse istemeden JVM'yi başlatır yanlış bir sınıfyoluyla.
Kısacası, bu sorunu bir IDE'de alırsanız, eski IDE durumu, bozuk proje referansları veya bozuk başlatıcı yapılandırmaları gibi şeyleri kontrol edin.
Bir IDE'nin basitçe karıştırılması da mümkündür. IDE'ler birbiriyle etkileşen birçok parça içeren oldukça karmaşık yazılım parçalarıdır. Bu parçaların birçoğu IDE'yi bir bütün olarak duyarlı hale getirmek için çeşitli önbellek stratejileri benimser. Bunlar bazen yanlış olabilir ve olası bir belirti, uygulamaları başlatırken karşılaşılan sorunlardır. Bunun olabileceğinden şüpheleniyorsanız, IDE'nizi yeniden başlatmak, projeyi yeniden oluşturmak vb. Gibi diğer şeyleri denemeye değer.
java -cp ../third-party-library.jar com.my.package.MyClass
:; Bu işe yaramaz, bunun yerine yerel yolu sınıf yoluna da eklemek gerekir (bununla ayrılarak :
: java -cp ../third-party-library.jar:. com.my.package.MyClass
şu şekilde çalışması gerekir
java
içe aktarılan bir sınıf bulamadığını değil, çalıştırmaya çalıştığınız ana sınıfı söylemediğini görmek üzücü . Bunun yanıltıcı olmasına rağmen, bunun bir nedeni olduğundan eminim. java
Sınıfımın tam olarak nerede olduğunu bildim, ancak ithal edilen sınıflardan birini bulamadı. Bunu söylemek yerine, ana sınıfımı bulamamaktan yakındı. Gerçekten sinir bozucu.
Kaynak kod adınız HelloWorld.java ise, derlenmiş kodunuz olacaktır HelloWorld.class
.
Şunu kullanarak ararsanız bu hatayı alırsınız:
java HelloWorld.class
Bunun yerine şunu kullanın:
java HelloWorld
javac TestCode.java
ardındanjava TestCode
java -classpath . HelloWorld
Dersleriniz ambalajlarda ise o zaman gerek cd
projenizin kök dizinine ve sınıf (packageName.MainClassName) tam nitelikli adını kullanarak çalıştırın.
Misal:
Derslerim burada:
D:\project\com\cse\
Ana sınıfımın tam adı:
com.cse.Main
Bu yüzden cd
kök proje dizinine geri dönüyorum:
D:\project
Sonra java
komutu verin:
java com.cse.Main
Bu cevap, acemi java programcılarını ortak bir hatanın neden olduğu hayal kırıklığından kurtarmak için, java sınıfyolu hakkında daha ayrıntılı bilgi için kabul edilen cevabı okumanızı tavsiye ederim.
Ana sınıfı ve ana yöntemi a öğesinde tanımlarsanızpackage
, sınıfın ( packageName.MainClassName
) tam adını kullanarak hiyerarşik dizin üzerinde çalıştırmalısınız .
Bir kaynak kodu dosyası olduğunu varsayın (Main.java):
package com.test;
public class Main {
public static void main(String[] args) {
System.out.println("salam 2nya\n");
}
}
Bu kodu çalıştırmak Main.Class
için pakete dizin gibi yerleştirmelisiniz ./com/test/Main.Java
. Ve kök dizinde kullanın java com.test.Main
.
Aynı kod bir bilgisayarda çalıştığında, ancak başka bir bilgisayarda hatayı gösterdiğinde, şimdiye kadar bulduğum en iyi çözüm aşağıdaki gibi derleniyor:
javac HelloWorld.java
java -cp . HelloWorld
javac -classpath . HelloWorld.java
işe yarardı! Ve bu sizin durumunuzda daha iyi bir çözümdür.
Bana yardımcı olan, komut satırında sınıf yolunu belirtmekti, örneğin:
Yeni bir klasör oluşturun, C:\temp
İçinde C:\temp
aşağıdaki sınıfla Temp.java dosyası oluşturun :
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
Klasörde bir komut satırı açın C:\temp
ve Temp sınıfını derlemek için aşağıdaki komutu yazın:
javac Temp.java
Derlenmiş Java sınıfını çalıştırın ve JRE'nin sınıfı -classpath
nerede bulacağını bildirme seçeneğini ekleyin:
java -classpath C:\temp Temp Hello!
java
Eğer sınıf yolu ayarı değildi ortamda ayarlanmamış -classpath veya -jar) veya 2) kullanılan çünkü ($ CLASSPATH'e bakmıyordu yürürlükte bağlamında java
oldu Çalıştırmak; Örneğin, setenv komutlarını sağ kabuğa eklediğiniz dosyayı "kaynaklamadığınız" için.
Hata mesajına göre ("Ana sınıf bulunamadı veya yüklenemedi"), iki sorun kategorisi vardır:
Ana sınıfı edilemeyen bulundu varken yazım hatası ya da yanlış sözdizimi tam nitelikli sınıf adında veya sağlanan sınıf yolunda yok .
Ana sınıfı edilemeyen yüklü olduğunda sınıfı başlatılamaz tipik olarak ana sınıfı başka bir sınıfı uzanır ve bir sınıfı sağlanmıştır sınıf yolunda mevcut değildir.
Örneğin:
public class YourMain extends org.apache.camel.spring.Main
Deve yayı dahil edilmezse, bu hata rapor edilir.
extends
). Sadece ana sınıfı başarısız olduğunda o zor yoldan öğrendim yük o olamazdı başka uzanır, çünkü bulundu , java bulunamadı fiili hangi sınıf bildirmez (aksine NoClassDefFoundError
). Yani evet oluyor ve bunu bilmediğinizde saçınızı çeken bir durum var.
Bu durumda böyle bir hata vardı:
java -cp lib.jar com.mypackage.Main
;
Windows ve :
Unix için çalışır :
java -cp lib.jar; com.mypackage.Main
Main
JAR dosyasında olmamasıdır. sınıf yoluna dahil edilen geçerli dizinle -cp lib.jar;
aynı anlama gelir -cp lib.jar;.
.
-Xdiag'ı deneyin .
Steve C'nin cevabı olası vakaları iyi bir şekilde kapsar, ancak bazen sınıfın bulunamadığını veya yüklenemediğini belirlemek o kadar kolay olmayabilir. java -Xdiag
(JDK 7'den beri) kullanın . Bu, mesaj Could not find or load main class
mesajının ne anlama geldiğine dair bir ipucu veren güzel bir yığın izi yazdırır .
Örneğin, sizi ana sınıf tarafından kullanılan ve bulunamayan ve ana sınıfın yüklenmesini engelleyen diğer sınıflara yönlendirebilir.
Bu komutu kullanın:
java -cp . [PACKAGE.]CLASSNAME
Örnek: Sınıf adınız Hello.java'dan oluşturulan Hello.class ise, aşağıdaki komutu kullanın:
java -cp . Hello
Hello.java dosyanız com.demo paketinin içindeyse aşağıdaki komutu kullanın
java -cp . com.demo.Hello
JDK 8 ile birçok kez sınıf dosyası aynı klasörde bulunur, ancak java
komut sınıfyolunu bekler ve bu nedenle -cp .
geçerli klasörü sınıf yolu için referans olarak almayı ekleriz .
-cp .
için gereksizdir, çünkü $CLASSPATH
ayarlanmamışsa .
varsayılan sınıfyoludur.
echo %CLASSPATH%
Çıktı nedir?) Ve hayır, kontrol edemiyorum çünkü Windows bilgisayarım yok.
Bazen soruna neden olan şeyin ana sınıfla bir ilgisi yoktur ve bunu zor yoldan bulmak zorunda kaldım. Taşındığım referanslı bir kütüphaneydi ve bana şunları verdi:
Ana sınıf xxx Linux bulunamadı veya yüklenemedi
Bu referansı yeni sildim, tekrar ekledim ve tekrar işe yaradı.
Bu örnekte:
Ana sınıf bulunamadı veya yüklenemedi mi?
Çünkü "-classpath" kullanıyorsunuz, ancak çizgi java
komut isteminde kullanılan aynı çizgi değil . Kopyalama ve Not Defteri'nden cmd yapıştırma bu sorunu vardı .
Aynı sorunu vardı ve sonunda hatamı buldum :) Derleme için bu komutu kullandım ve doğru çalıştı:
javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java
Ama bu komut benim için çalışmadı (ana sınıfı bulamadım veya yükleyemedim qrcode
):
java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode
Sonunda sınıf yolunun sonuna ':' karakterini ekledim ve problem çözüldü:
java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode
Durumunuz benimki gibi ise bu size yardımcı olabilir: Yeni başlayanlar olarak bir Java programını çalıştırmaya çalıştığımda da bu problemle karşılaştım.
Ben şöyle derledim:
javac HelloWorld.java
Ve aynı uzantıyla da çalışmayı denedim:
java Helloworld.java
.java
Komutu kaldırdığımda ve komutu yeniden yazdığımda java HelloWorld
, program mükemmel bir şekilde çalıştı. :)
Buradaki tüm yanıtlar, görünüşe göre Windows kullanıcılarına yöneliktir. Mac için, sınıf yolu ayırıcısı :
değildir ;
. Hata olarak sınıf yolunu ayarlarken;
, Windows'tan Mac'e geliyorsa bunu bulmak zor olabilir.
İşte karşılık gelen Mac komutu:
java -classpath ".:./lib/*" com.test.MyClass
Bu örnekte paket com.test
ve lib
sınıf yoluna bir klasör de dahil edilecektir.
/*
gerekli?
Sınıf dosyası konumu: C: \ test \ com \ company
Dosya Adı: Main.class
Tam nitelikli sınıf adı: com.company.Main
Komut satırı komutu:
java -classpath "C:\test" com.company.Main
Burada sınıf yolunun \ com \ company içermediğini unutmayın
Bu sorunu çözmeye çalışmak için iyi bir zaman geçirdim. Bir şekilde benim sınıf yolu yanlış ayarlanmış olduğunu düşündüm ama sorun ben yazdım oldu:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
onun yerine:
java -cp C:/java/MyClasses utilities/myapp/Cool
Tam olarak nitelenmenin anlamının, tam paket adı yerine tam yol adını içermesi gerektiğini düşündüm.
utilities.myapp.Cool
, varsa paket adı olarak veya varsa adı verilmelidir .
Önce bu komutu kullanarak yolu ayarlayın;
set path="paste the set path address"
O zaman programı yüklemeniz gerekir. Saklanan sürücüye "cd (klasör adı)" yazın ve derleyin. Örneğin, programım D sürücüsünde depolanmışsa, "D:" yazın ve enter tuşuna basın ve "cd (klasör adı)" yazın.
if "cd" helps then it by luck rather than by judgement
. Java, .
varsayılan olarak sınıf yolunun bir parçası olarak geçerli dizini kullandığından, bu (inanıyorum) yanlıştır .
Benim durumumda sorunu ne düzeltti:
Çalıştırmak istediğiniz projeye / sınıfa sağ tıklayın, ardından Run As
-> Run Configurations
. Ardından, mevcut yapılandırmanızı düzeltmeli veya aşağıdaki şekilde yenisini eklemelisiniz:
Classpath
sekmeyi açın, Advanced...
düğmeyi tıklayın ve ardından projenizin bin
klasörünü ekleyin .
JAR dosyasını oluşturmak için Maven kullanıyorsanız , lütfen pom.xml dosyasında ana sınıfı belirttiğinizden emin olun:
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>class name us.com.test.abc.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Bu özel bir durum, ancak bu sayfaya bir çözüm arayan ve bulamadığım için buraya ekleyeceğim.
Windows (7 ile test edilmiştir á
) sınıf ve paket adlarında özel karakterleri (örneğin ) kabul etmez . Linux da öyle.
Ben .jar
NetBeans bir inşa ve komut satırında çalıştırmaya çalışırken bunu öğrendim . NetBeans'te çalıştırıldı, ancak komut satırında değil.
Windows'ta .;
başlangıçta CLASSPATH değerine koyun .
. (nokta) "geçerli dizine bak" anlamına gelir. Bu kalıcı bir çözümdür.
Ayrıca set ile "bir kez" ayarlayabilirsiniz CLASSPATH=%CLASSPATH%;.
. Bu, cmd pencereniz açık olduğu sürece devam eder.
Bunu gerçekten src
klasörden yapmanız gerekir . Orada aşağıdaki komut satırını yazıyorsunuz:
[name of the package].[Class Name] [arguments]
Diyelim ki sınıfınız çağrıldı CommandLine.class
ve kod şöyle görünüyor:
package com.tutorialspoint.java;
/**
* Created by mda21185 on 15-6-2016.
*/
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
Sonra cd
src klasörüne gitmelisiniz ve çalıştırmanız gereken komut şöyle görünecektir:
java com.tutorialspoint.java.CommandLine this is a command line 200 -100
Ve komut satırındaki çıktı:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
cd
girmek zorunda kaldım . Yani bahşiş için teşekkürler! src
java ../bin com.blah.blah.MyClass
Java'da, java yürütülebilir dosyasını kullanarak bazen JVM'yi komut satırından çalıştırdığınızda ve genel statik void main (PSVM) olan bir sınıf dosyasından bir program başlatmaya çalıştığınızda, classpath parametresi JVM doğrudur ve sınıf dosyası sınıfyolunda bulunur:
Error: main class not found or loaded
PSVM olan sınıf dosyası yüklenemediğinde bu olur. Bunun olası bir nedeni, sınıfın bir arabirim uygulamak veya sınıfyolunda olmayan başka bir sınıfı genişletmesi olabilir. Normalde bir sınıf sınıfyolunda değilse, atılan hata bu şekilde gösterilir. Ancak, kullanılan sınıf genişletilir veya uygulanırsa, java sınıfın kendisini yükleyemez.
Referans: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/
Windows PowerShell'de reklamı java
yapılan -cp
seçenekle çalışırken, aşağıdakine benzer bir hata alabilirsiniz:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
PowerShell'in komutu kabul edebilmesi için, -cp
seçeneğin bağımsız değişkenleri aşağıdaki gibi tırnak içine alınmalıdır:
java -cp 'someDependency.jar;.' ClassName
Komutun bu şekilde oluşturulması, Java'nın sınıf yolu bağımsız değişkenlerini doğru şekilde işlemesine izin vermelidir.
Java MongoDB JDBC bağlantısını test ederken de benzer hatalarla karşılaştım. Bence nihai çözümümü kısaca özetlemek iyi olacak, böylece gelecekte herkes iki komuta doğrudan bakabilir ve daha ileriye gidebilir.
Java dosyanızın ve harici bağımlılıkların (JAR dosyaları) bulunduğu dizinde olduğunuzu varsayın.
Derleme:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Çalıştırmak:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnection
hiçbir paketi olmadığını ve 2) dizini değiştirmediğinizi varsayar . Az söylemek gerekirse kırılgandır. Ve sorunları açıklamamak, yeni başlayanların çalışmadığı durumlarda bu yaklaşımı denemelerine yol açacaktır . Kısacası, "voodoo programlama teknikleri" ni teşvik eder: en.wikipedia.org/wiki/Voodoo_programming
Pekala, zaten birçok cevap var, ancak kimse dosya izinlerinin suçlu olabileceği durumundan bahsetmedi.
Çalıştırırken, kullanıcının JAR dosyasına veya yolun dizinlerinden birine erişimi olmayabilir. Örneğin:
Jar dosyası /dir1/dir2/dir3/myjar.jar
JAR dosyasının sahibi olan Kullanıcı1 şunları yapabilir:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
Ama yine de çalışmıyor:
# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
Bunun nedeni, çalışan kullanıcının (Kullanıcı2) dir1, dir2 veya javalibs veya dir3'e erişimi olmamasıdır. Kullanıcı1 dosyaları görebildiğinde ve dosyalara erişebildiğinde birisini delebilir, ancak kullanıcı2 için hala hata oluşur.
Ben yaptıktan sonra bu hatayı aldım Bu mvn eclipse:eclipse
benim .classpath
dosya biraz berbat .
Satırları değiştirmek zorunda kaldı .classpath
dan
<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
için
<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
Bu sorunu burada belirtilen çözümlerle çözemedim (belirtilen cevap şüphesiz konseptlerimi temizlemiş olsa da). Bu sorunla iki kez karşılaştım ve her seferinde farklı çözümler denedim (Eclipse IDE'de).
main
farklı sınıflarında birden çok yöntemle karşılaştım. Bu yüzden main
yöntemi sonraki sınıflardan silmiştim .main
Yöntemleri silmek sorunu çözmez. Birden fazla giriş noktası olan bir uygulamada teknik olarak yanlış bir şey yoktur.