Częstym problemem występującym u nowych programistów Java jest to, że ich programy nie działają z komunikatem o błędzie: Could not find or load main class ...
Co to znaczy, co go powoduje i jak to naprawić?
Częstym problemem występującym u nowych programistów Java jest to, że ich programy nie działają z komunikatem o błędzie: Could not find or load main class ...
Co to znaczy, co go powoduje i jak to naprawić?
Odpowiedzi:
java <class-name>
Składnia poleceniaPrzede wszystkim musisz zrozumieć prawidłowy sposób uruchamiania programu za pomocą polecenia java
(lub javaw
).
Normalna składnia 1 jest następująca:
java [ <options> ] <class-name> [<arg> ...]
gdzie <option>
jest opcją wiersza poleceń (zaczynającą się od znaku „-”), <class-name>
jest w pełni kwalifikowaną nazwą klasy Java i <arg>
jest dowolnym argumentem wiersza poleceń przekazywanym do aplikacji.
1 - Istnieje kilka innych składni opisanych na końcu tej odpowiedzi.
W pełni kwalifikowana nazwa (FQN) dla klasy jest tradycyjnie zapisywana tak jak w kodzie źródłowym Java; na przykład
packagename.packagename2.packagename3.ClassName
Jednak niektóre wersje java
polecenia pozwalają używać ukośników zamiast kropek; na przykład
packagename/packagename2/packagename3/ClassName
który (myląco) wygląda jak ścieżka do pliku, ale nie jest nim. Zwróć uwagę, że termin w pełni kwalifikowana nazwa jest standardową terminologią Java ... a nie czymś, co właśnie wymyśliłem, aby cię zdezorientować :-)
Oto przykład, jak java
powinno wyglądać polecenie:
java -Xmx100m com.acme.example.ListUsers fred joe bert
Powyższe spowoduje, że java
polecenie wykona następujące czynności:
com.acme.example.ListUsers
klasy.main
metodę z podpisem , typem zwrotu i modyfikatorami podanymi przez public static void main(String[])
. (Uwaga: nazwa argumentu metody NIE jest częścią podpisu).String[]
.Gdy pojawi się komunikat „Nie można znaleźć lub załadować głównej klasy ...”, oznacza to, że pierwszy krok nie powiódł się. java
Polecenie nie był w stanie znaleźć klasę. I rzeczywiście, „...” w wiadomości będzie w pełni kwalifikowaną nazwą klasy, której java
szuka.
Dlaczego więc nie może znaleźć klasy?
Pierwszą prawdopodobną przyczyną jest podanie niewłaściwej nazwy klasy. (Lub ... właściwa nazwa klasy, ale w złej formie.) Biorąc pod uwagę powyższy przykład, oto wiele niewłaściwych sposobów określania nazwy klasy:
Przykład 1 - prosta nazwa klasy:
java ListUser
Gdy klasa jest zadeklarowana w pakiecie takim jak np. com.acme.example
, Musisz użyć pełnej nazwy klasy wraz z nazwą pakietu w java
poleceniu; na przykład
java com.acme.example.ListUser
Przykład # 2 - nazwa pliku lub ścieżka zamiast nazwy klasy:
java ListUser.class
java com/acme/example/ListUser.class
Przykład # 3 - nazwa klasy z niepoprawną obudową:
java com.acme.example.listuser
Przykład # 4 - literówka
java com.acme.example.mistuser
Przykład # 5 - nazwa pliku źródłowego (oprócz Java 11 lub nowszego; patrz poniżej)
java ListUser.java
Przykład # 6 - całkowicie zapomniałeś nazwy klasy
java lots of arguments
Drugą prawdopodobną przyczyną jest to, że nazwa klasy jest poprawna, ale java
polecenie nie może znaleźć klasy. Aby to zrozumieć, musisz zrozumieć pojęcie „ścieżki klas”. Wyjaśnia to dobrze dokumentacja Oracle:
java
poleceniaWięc ... jeśli poprawnie podałeś nazwę klasy, następną rzeczą do sprawdzenia jest poprawne określenie ścieżki klas:
java
polecenia. Sprawdź, czy nazwy katalogów i nazwy plików JAR są poprawne.java
polecenia.;
w systemie Windows i :
innych. Jeśli użyjesz niewłaściwego separatora dla swojej platformy, nie otrzymasz wyraźnego komunikatu o błędzie. Zamiast tego otrzymasz ścieżkę, która nie istnieje, w ścieżce, która zostanie po cichu zignorowana .)Gdy umieścisz katalog w ścieżce klas, teoretycznie odpowiada on katalogowi głównemu kwalifikowanej przestrzeni nazw. Klasy znajdują się w strukturze katalogów poniżej tego katalogu głównego, poprzez mapowanie w pełni kwalifikowanej nazwy na nazwę ścieżki . Na przykład, jeśli „/ usr / local / acme / klas” znajduje się na ścieżce klasy, to kiedy JVM szuka klasy o nazwie com.acme.example.Foon
, będzie szukał pliku „.class” o tej nazwie ścieżki:
/usr/local/acme/classes/com/acme/example/Foon.class
Jeśli umieściłeś „/ usr / local / acme / klas / com / acme / example” na ścieżce klasy, JVM nie byłby w stanie znaleźć klasy.
Jeśli FQN twoich klas com.acme.example.Foon
, to JVM będzie szukać „Foon.class” w katalogu „com / acme / example”:
Jeśli struktura katalogów nie odpowiada nazwie pakietu zgodnie z powyższym wzorcem, JVM nie znajdzie twojej klasy.
Jeśli spróbujesz zmienić nazwę klasy, przenosząc ją, to również się nie powiedzie ... ale wyjątek stacktrace będzie inny. Można powiedzieć coś takiego:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
ponieważ nazwa FQN w pliku klasy nie zgadza się z tym, czego oczekuje moduł ładujący klasy.
Podając konkretny przykład, załóżmy, że:
com.acme.example.Foon
klasę,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,następnie:
# 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
Uwagi:
-classpath
Opcja może być skrócony do -cp
większości wydań Java. Sprawdź odpowiednie wpisy dla manualnych java
, javac
i tak dalej.Ścieżka klasy musi zawierać wszystkie inne (niesystemowe) klasy, od których zależy twoja aplikacja. (Klasy systemowe są lokalizowane automatycznie i rzadko trzeba się tym zajmować.) Aby klasa główna poprawnie się załadowała, JVM musi znaleźć:
(Uwaga: specyfikacje JLS i JVM pozwalają JVM na pewien zakres ładowania klas „leniwie”, co może mieć wpływ, gdy zostanie zgłoszony wyjątek programu ładującego klasy.)
Czasami zdarza się, że ktoś umieszcza plik kodu źródłowego w niewłaściwym folderze w drzewie kodu źródłowego lub pomija package
deklarację. Jeśli zrobisz to w środowisku IDE, kompilator IDE natychmiast o tym powie. Podobnie, jeśli używasz przyzwoitego narzędzia do budowania Java, narzędzie będzie działać javac
w sposób, który wykryje problem. Jeśli jednak zbudujesz kod Java ręcznie, możesz to zrobić w taki sposób, aby kompilator nie zauważył problemu, a wynikowy plik „.class” nie znajduje się w miejscu, w którym się spodziewasz.
Jest wiele rzeczy do sprawdzenia i łatwo coś przeoczyć. Spróbuj dodać -Xdiag
opcję do java
wiersza poleceń (jako pierwszą rzecz po java
). Wyprowadzi różne rzeczy na temat ładowania klas, a to może dać ci wskazówki co do prawdziwego problemu.
Weź również pod uwagę możliwe problemy związane z kopiowaniem i wklejaniem niewidocznych znaków spoza ASCII ze stron internetowych, dokumentów itp. I rozważmy „homoglify”, gdyby dwie litery lub symbole wyglądały tak samo… ale nie są.
Wreszcie, najwyraźniej możesz napotkać ten problem, jeśli spróbujesz uruchomić z pliku JAR z niepoprawnymi podpisami (META-INF/*.SF)
.
java
Istnieją trzy alternatywne składnie do uruchamiania programów Java za pomocą java command
.
1) Składnia używana do uruchamiania „wykonywalnego” pliku JAR jest następująca:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
na przykład
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
Nazwa klasy punktu wejścia (tj. com.acme.example.ListUser
) I ścieżka klasy są określone w pliku MANIFEST pliku JAR.
2) Składnia do uruchamiania aplikacji z modułu (Java 9 i nowsze) jest następująca:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
Nazwa klasy punktu wejścia jest albo zdefiniowana przez <module>
siebie, albo jest podana opcjonalnie <mainclass>
.
3) Począwszy od Java 11, możesz skompilować i uruchomić pojedynczy plik kodu źródłowego i uruchomić go z następującą składnią:
java [ <options> ] <sourcefile> [<arg> ...]
gdzie jest (zazwyczaj) plik z przyrostkiem „.java”.
Aby uzyskać więcej informacji, zapoznaj się z oficjalną dokumentacją java
polecenia używanej wersji Java.
Typowe środowisko Java IDE obsługuje obsługę aplikacji Java w samej maszynie JVM IDE lub w podrzędnej maszynie JVM. Na ogół są one odporne na ten szczególny wyjątek, ponieważ IDE używa własnych mechanizmów do konstruowania ścieżki klas środowiska wykonawczego, identyfikacji głównej klasy i utworzenia java
wiersza poleceń.
Jednak nadal jest możliwe wystąpienie tego wyjątku, jeśli wykonasz czynności za zapleczem IDE. Na przykład, jeśli wcześniej skonfigurowałeś program uruchamiający aplikację dla aplikacji Java w Eclipse, a następnie przeniosłeś plik JAR zawierający klasę „main” w inne miejsce w systemie plików bez informowania Eclipse , Eclipse nieświadomie uruchomiłby JVM z niepoprawną ścieżką klasy.
Krótko mówiąc, jeśli ten problem występuje w środowisku IDE, sprawdź takie rzeczy, jak nieaktualny stan IDE, uszkodzone odwołania do projektu lub uszkodzone konfiguracje programu uruchamiającego.
Możliwe jest również, że IDE po prostu się pomyli. IDE to niezwykle skomplikowane oprogramowanie składające się z wielu interaktywnych części. Wiele z tych części przyjmuje różne strategie buforowania, aby IDE jako całość reagowało. Czasami mogą się nie udać, a jednym z możliwych symptomów są problemy podczas uruchamiania aplikacji. Jeśli podejrzewasz, że tak się dzieje, warto spróbować innych rzeczy, takich jak ponowne uruchomienie IDE, przebudowa projektu i tak dalej.
java -cp ../third-party-library.jar com.my.package.MyClass
:; to nie działa, zamiast tego należy również dodać folder lokalny do ścieżki klasy (oddzielone :
, tak: to java -cp ../third-party-library.jar:. com.my.package.MyClass
, to powinno działać
java
nie mówi, że nie znajduje klasy importowanej, ale klasę główną, którą próbujesz uruchomić. Jest to mylące, chociaż jestem pewien, że istnieje ku temu powód. Miałem przypadek, w którym java
wiedziałem dokładnie, gdzie jest moja klasa, jednak nie mógł znaleźć jednej z zaimportowanych klas. Zamiast tego powiedzieć, że narzekał, że nie znalazł mojej głównej klasy. Naprawdę, annoing.
Jeśli nazwa źródłowa to HelloWorld.java, skompilowany kod będzie HelloWorld.class
.
Ten błąd pojawi się, jeśli wywołasz go za pomocą:
java HelloWorld.class
Zamiast tego użyj tego:
java HelloWorld
javac TestCode.java
a następniejava TestCode
java -classpath . HelloWorld
Jeśli twoje klasy znajdują się w pakietach , musisz przejść cd
do katalogu głównego projektu i uruchomić przy użyciu w pełni kwalifikowanej nazwy klasy (nazwa_pakietu.MainClassName).
Przykład:
Moje zajęcia są tutaj:
D:\project\com\cse\
W pełni kwalifikowana nazwa mojej głównej klasy to:
com.cse.Main
Więc cd
wracam do głównego katalogu projektu:
D:\project
Następnie wydaj java
polecenie:
java com.cse.Main
Ta odpowiedź ma na celu uratowanie początkujących programistów Java przed frustracją spowodowaną powszechnym błędem. Zalecam przeczytanie przyjętej odpowiedzi, aby uzyskać bardziej szczegółową wiedzę na temat ścieżki klas języka Java.
Jeśli zdefiniujesz główną klasę i główną metodę w apackage
, powinieneś uruchomić ją w katalogu hierarchicznym, używając pełnej nazwy klasy ( packageName.MainClassName
).
Załóżmy, że istnieje plik kodu źródłowego (Main.java):
package com.test;
public class Main {
public static void main(String[] args) {
System.out.println("salam 2nya\n");
}
}
Aby uruchomić ten kod, powinieneś umieścić go Main.Class
w katalogu podobnym do pakietu ./com/test/Main.Java
. I użyj katalogu głównego java com.test.Main
.
Gdy ten sam kod działa na jednym komputerze, ale pokazuje błąd na innym, najlepszym rozwiązaniem, jakie kiedykolwiek znalazłem, jest kompilacja w następujący sposób:
javac HelloWorld.java
java -cp . HelloWorld
javac -classpath . HelloWorld.java
by działało! I to jest lepsze rozwiązanie w twoim przypadku.
Pomogło mi określenie ścieżki klasy w wierszu poleceń, na przykład:
Stworzyć nowy folder, C:\temp
Utwórz plik Temp.java w C:\temp
, zawierający następującą klasę:
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
Otwórz wiersz polecenia w folderze C:\temp
i napisz następujące polecenie, aby skompilować klasę Temp:
javac Temp.java
Uruchom skompilowaną klasę Java, dodając -classpath
opcję, aby JRE wiedział, gdzie znaleźć klasę:
java -classpath C:\temp Temp Hello!
java
nie patrzył na $ CLASSPATH (ponieważ użyłeś -classpath lub -jar) lub 2) ustawienie classpath nie został ustawiony w środowisku, które nie było w rzeczywistości w kontekście faktu, że java
był biegać; np. dlatego, że nie „źródłeś” pliku, do którego dodano komendy setenv we właściwej powłoce.
Zgodnie z komunikatem o błędzie („Nie można znaleźć lub załadować głównej klasy”) istnieją dwie kategorie problemów:
Nie można znaleźć klasy głównej, jeśli literówka lub niepoprawna składnia występuje w pełnej nazwie klasy lub nie istnieje ona w podanej ścieżce klasy .
Nie można załadować klasy głównej, gdy nie można zainicjować klasy , zazwyczaj klasa główna rozszerza inną klasę i ta klasa nie istnieje w podanej ścieżce klas.
Na przykład:
public class YourMain extends org.apache.camel.spring.Main
Jeśli nie uwzględniono sprężyny wielbłąda, ten błąd zostanie zgłoszony.
extends
). Właśnie nauczyłem się na własnej skórze, że gdy klasa główna nie ładuje się, ponieważ rozszerza inną, której nie można znaleźć , java nie zgłasza, która klasa nie została znaleziona (w przeciwieństwie do NoClassDefFoundError
). Tak, tak się dzieje, a kiedy się o tym nie wie, jest to sytuacja ciągnąca za włosy.
Miałem taki błąd w tym przypadku:
java -cp lib.jar com.mypackage.Main
Działa z ;
systemami Windows i :
Unix:
java -cp lib.jar; com.mypackage.Main
Main
nie ma go w pliku JAR. -cp lib.jar;
oznacza to samo co -cp lib.jar;.
np. bieżący katalog jest zawarty w ścieżce klasy.
Spróbuj -Xdiag .
Odpowiedź Steve'a C ładnie obejmuje możliwe przypadki, ale czasem ustalenie, czy nie można znaleźć lub załadować klasy, może nie być takie proste. Użyj java -Xdiag
(od JDK 7). Wyświetla to ładny ślad stosu, który daje podpowiedź do tego, co Could not find or load main class
oznacza komunikat.
Może na przykład wskazywać inne klasy używane przez klasę główną, których nie można znaleźć, i uniemożliwił załadowanie klasy głównej.
Użyj tego polecenia:
java -cp . [PACKAGE.]CLASSNAME
Przykład: jeśli twoja nazwa klasy to Hello.class utworzona z Hello.java, użyj następującego polecenia:
java -cp . Hello
Jeśli plik Hello.java znajduje się w pakiecie com.demo, użyj poniższej komendy
java -cp . com.demo.Hello
Z JDK 8 wiele razy zdarza się, że plik klasy znajduje się w tym samym folderze, ale java
polecenie oczekuje ścieżki klasy i dlatego dodajemy, -cp .
aby wziąć bieżący folder jako odniesienie do ścieżki klasy.
-cp .
jest konieczne, ponieważ jeśli nie $CLASSPATH
jest ustawione, to .
jest domyślna ścieżka klasy.
echo %CLASSPATH%
wynik?) I nie, nie mogę sprawdzić, ponieważ nie mam komputera z systemem Windows.
Czasami to, co może być przyczyną problemu, nie ma nic wspólnego z klasą główną i musiałem to znaleźć na własnej skórze. To była biblioteka, do której się odwołałem, którą przeniosłam i dała mi:
Nie można znaleźć lub załadować głównej klasy xxx Linux
Właśnie usunąłem to odniesienie, dodałem je ponownie i znów zadziałało.
W tym przypadku masz:
Nie można znaleźć lub załadować głównej klasy ? Classpath
Jest tak, ponieważ używasz „-classpath”, ale myślnik nie jest tym samym myślnikiem, którego używasz java
w wierszu polecenia. Miałem problem z kopiowaniem i wklejaniem z Notatnika na cmd.
Miałem ten sam problem i w końcu znalazłem swój błąd :) Użyłem tego polecenia do kompilacji i działało poprawnie:
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
Ale to polecenie nie działało dla mnie (nie mogłem znaleźć ani załadować głównej klasy 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
W końcu właśnie dodałem znak „:” na końcu ścieżki klas i problem został rozwiązany:
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
Może ci to pomóc, jeśli twoja sprawa jest dokładnie taka jak moja: jako początkujący napotkałem również ten problem, gdy próbowałem uruchomić program Java.
Skompilowałem to w następujący sposób:
javac HelloWorld.java
Próbowałem też uruchomić to samo rozszerzenie:
java Helloworld.java
Kiedy usunąłem .java
i przepisałem polecenie jak java HelloWorld
, program działał idealnie. :)
Wszystkie odpowiedzi tutaj są skierowane do użytkowników systemu Windows. W przypadku komputerów Mac separator ścieżki klas :
nie jest ;
. Ponieważ błąd ustawiania używania ścieżki klasy ;
nie jest generowany, może to być trudne do wykrycia, jeśli pochodzi z systemu Windows na komputer Mac.
Oto odpowiednie polecenie Maca:
java -classpath ".:./lib/*" com.test.MyClass
Gdzie w tym przykładzie jest paczka com.test
i lib
folder ma być również dołączony do ścieżki klasy.
/*
jest to konieczne?
Lokalizacja pliku klasy: C: \ test \ com \ company
Nazwa pliku: Main.class
W pełni kwalifikowana nazwa klasy: com.company.Main
Polecenie z wiersza poleceń:
java -classpath "C:\test" com.company.Main
Zauważ, że ścieżka klasy NIE zawiera \ com \ company
Sporo czasu poświęciłem na rozwiązanie tego problemu. Myślałem, że w jakiś sposób nieprawidłowo ustawiłem ścieżkę klasy, ale problem polegał na tym, że wpisałem:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
zamiast:
java -cp C:/java/MyClasses utilities/myapp/Cool
Pomyślałem, że znaczenie w pełni kwalifikowane ma obejmować pełną nazwę ścieżki zamiast pełnej nazwy pakietu.
utilities.myapp.Cool
lub jakakolwiek jest nazwa pakietu, jeśli istnieje.
Najpierw ustaw ścieżkę za pomocą tego polecenia;
set path="paste the set path address"
Następnie musisz załadować program. Wpisz „cd (nazwa folderu)” na zapisanym dysku i skompiluj go. Na przykład, jeśli mój program jest zapisany na dysku D, wpisz „D:” naciśnij enter i wpisz „cd (nazwa folderu)”.
if "cd" helps then it by luck rather than by judgement
. To źle (jak sądzę), ponieważ Java .
domyślnie używa bieżącego katalogu jako części ścieżki klas.
Tym, co naprawiło problem w moim przypadku, było:
Kliknij prawym przyciskiem myszy projekt / klasę, którą chcesz uruchomić, a następnie Run As
-> Run Configurations
. Następnie należy naprawić istniejącą konfigurację lub dodać nową w następujący sposób:
otwórz Classpath
kartę, kliknij Advanced...
przycisk, a następnie dodaj bin
folder swojego projektu.
Jeśli używasz Maven do zbudowania pliku JAR, upewnij się, że określiłeś klasę główną w pliku pom.xml:
<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>
Jest to szczególny przypadek, ale ponieważ wszedłem na tę stronę w poszukiwaniu rozwiązania i nie znalazłem go, dodam go tutaj.
Windows (testowany z 7) nie akceptuje znaków specjalnych (np á
) w nazwach klas i pakietów. Linux tak.
Dowiedziałem się tego, gdy zbudowałem .jar
NetBeans i próbowałem uruchomić go w wierszu poleceń. Działał w NetBeans, ale nie w wierszu poleceń.
W systemie Windows .;
na początku ustaw wartość CLASSPATH.
The. (kropka) oznacza „zajrzyj do bieżącego katalogu”. To jest trwałe rozwiązanie.
Możesz także ustawić „jednorazowo” za pomocą zestawu CLASSPATH=%CLASSPATH%;.
. Trwa to tak długo, jak długo okno cmd jest otwarte.
Naprawdę musisz to zrobić z src
folderu. Tam wpisz następujący wiersz polecenia:
[name of the package].[Class Name] [arguments]
Powiedzmy, że twoja klasa jest wywoływana CommandLine.class
, a kod wygląda następująco:
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]);
}
}
}
Następnie powinieneś cd
przejść do folderu src, a polecenie, które musisz uruchomić, wyglądałoby tak:
java com.tutorialspoint.java.CommandLine this is a command line 200 -100
Dane wyjściowe w wierszu poleceń będą następujące:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
cd
się src
, a następnie uruchomić komendę java ../bin com.blah.blah.MyClass
który pracował dla mnie. Dziękuję za podpowiedź!
W Javie, gdy czasami uruchamiasz JVM z wiersza poleceń za pomocą pliku wykonywalnego java i próbujesz uruchomić program z pliku klasy z publicznym statycznym void main (PSVM), możesz napotkać poniższy błąd, mimo że parametr classpath to JVM jest dokładny, a plik klasy jest obecny w ścieżce klasy:
Error: main class not found or loaded
Dzieje się tak, jeśli nie można załadować pliku klasy z PSVM. Jednym z możliwych powodów jest to, że klasa może implementować interfejs lub rozszerzać inną klasę, która nie znajduje się w ścieżce klas. Zwykle, jeśli klasa nie znajduje się w ścieżce klasy, zgłoszony błąd wskazuje jako taki. Ale jeśli używana klasa zostanie rozszerzona lub zaimplementowana, java nie będzie mogła załadować samej klasy.
Odniesienie: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/
Podczas uruchamiania java
z -cp
opcją opisaną w Windows PowerShell może pojawić się błąd, który wygląda mniej więcej tak:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
Aby program PowerShell mógł zaakceptować polecenie, argumenty -cp
opcji muszą być zawarte w cudzysłowach, jak w:
java -cp 'someDependency.jar;.' ClassName
Formowanie polecenia w ten sposób powinno pozwolić Java poprawnie przetwarzać argumenty ścieżki klasy.
Napotkałem również podobne błędy podczas testowania połączenia JDBC Java MongoDB. Myślę, że dobrze jest streścić moje ostateczne rozwiązanie w skrócie, aby w przyszłości każdy mógł bezpośrednio przyjrzeć się dwóm poleceniom i kontynuować.
Załóżmy, że znajdujesz się w katalogu, w którym istnieje plik Java i zależności zewnętrzne (pliki JAR).
Skompilować:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Biegać:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnection
nie ma pakietu i 2) nie zmieniasz katalogu. Jest to, delikatnie mówiąc, kruche. Nie wyjaśniając problemów, sprawi, że nowicjusze wypróbują to podejście w sytuacjach, w których nie będzie działać . Krótko mówiąc, zachęca do „technik programowania voodoo”: en.wikipedia.org/wiki/Voodoo_programming
W porządku, jest już wiele odpowiedzi, ale nikt nie wspomniał o przypadku, w którym winowajcą mogą być uprawnienia do plików.
Podczas działania użytkownik może nie mieć dostępu do pliku JAR lub jednego z katalogów ścieżki. Rozważ na przykład:
Plik jar w /dir1/dir2/dir3/myjar.jar
Użytkownik 1, który jest właścicielem pliku JAR, może:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
Ale nadal nie działa:
# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
Jest tak, ponieważ działający użytkownik (Użytkownik2) nie ma dostępu do katalogu 1, katalogu 2 lub javalibs lub katalogu 3. Może doprowadzić kogoś do szału, gdy Użytkownik1 może zobaczyć pliki i uzyskać do nich dostęp, ale błąd nadal występuje dla Użytkownika2.
Wystąpił ten błąd po zrobieniu mvn eclipse:eclipse
To .classpath
trochę popsuło mój plik.
Musiałem zmienić linie .classpath
z
<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
do
<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
Nie udało mi się rozwiązać tego problemu za pomocą podanych tutaj rozwiązań (chociaż podana odpowiedź niewątpliwie oczyściła moje koncepcje). Napotkałem ten problem dwa razy i za każdym razem próbowałem różnych rozwiązań (w środowisku Eclipse IDE).
main
metodami w różnych klasach mojego projektu. Usunąłem więc main
metodę z kolejnych klas.main
metod nie rozwiąże problemu. Nie ma nic technicznie złego w aplikacji, która ma wiele punktów wejścia.