Co oznacza "could not find or load main class"?

Częstym problemem, którego doświadczają nowi Programiści Javy, jest to, że ich programy nie działają z Komunikatem o błędzie: Could not find or load main class ...

Co to oznacza, co go powoduje i jak należy to naprawić?

Author: Stephen C, 2013-08-07

30 answers

Składnia polecenia java <class-name>

Przede wszystkim musisz zrozumieć prawidłowy sposób uruchamiania programu za pomocą polecenia java (lub javaw).

Składnia normalna1 jest to:

java [ <option> ... ] <class-name> [ <argument> ... ]

Gdzie <option> jest opcją wiersza poleceń (zaczynającą się od znaku" -"), <class-name> jest w pełni kwalifikowaną nazwą klasy Java, a <argument> jest arbitralnym argumentem wiersza poleceń przekazywanym do aplikacji.
1 - istnieje druga składnia dla" wykonywalnego " JAR pliki, które opiszę na dole.

W pełni kwalifikowana nazwa (FQN) dla klasy jest konwencjonalnie napisana tak, jak w kodzie źródłowym Javy; np.

packagename.packagename2.packagename3.ClassName

Zauważ, że termin w pełni kwalifikowana nazwa jest standardową terminologią Java ... nie jest to coś, co wymyśliłem, aby cię zmylić: -)

Oto przykład jak powinna wyglądać komenda java:

java -Xmx100m com.acme.example.ListUsers fred joe bert

Powyższe spowoduje, że komenda java zrobi po:

  1. wyszukaj skompilowaną wersję klasy com.acme.example.ListUsers.
  2. załaduj klasę.
  3. sprawdź, czy klasa ma metodę main z podpisem , return type i modyfikatory podane przez public static void main(String[]). (Uwaga, nazwa argumentu metody jest , a nie częścią podpisu.)
  4. wywołaj tę metodę przekazując jej argumenty linii poleceń ("fred", "joe", "bert") jako String[].

Powody, dla których Java nie może znaleźć Klasa

Kiedy 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ło w stanie znaleźć klasy. I rzeczywiście,"..."w wiadomości będzie w pełni kwalifikowana nazwa klasy , której java szuka.

Więc dlaczego nie może znaleźć klasy?

Powód # 1-popełniłeś błąd z argumentem classname

Pierwszą prawdopodobną przyczyną jest to, że zła nazwa klasy. (Lub ... właściwa nazwa klasy, ale w złej formie.) Biorąc pod uwagę powyższy przykład, tutaj wiele niewłaściwych sposobów , aby określić nazwę klasy:

  • Przykład # 1-prosta nazwa klasy:

    java ListUser
    

    Gdy klasa jest zadeklarowana w pakiecie takim jak com.acme.example, musisz użyć pełnej nazwy klasy , w tym nazwy pakietu w poleceniu java, np.

    java com.acme.example.ListUser
    
  • Przykład # 2-nazwa pliku lub ścieżka niż nazwa 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

    java ListUser.java
    
  • Przykład # 6-całkowicie zapomniałeś nazwy klasy

    java lots of arguments
    

Powód # 2 - ścieżka klasowa aplikacji jest nieprawidłowo określona

Drugą prawdopodobną przyczyną jest to, że nazwa klasy jest poprawna, ale że java polecenie nie może znaleźć klasy. Aby to zrozumieć, musisz zrozumieć pojęcie "classpath". Jest to wyjaśnione dobrze przez dokumentację Oracle:

Więc ... jeśli poprawnie podałeś nazwę klasy, następną rzeczą do sprawdzenia jest to, że podałeś ścieżkę klasy poprawnie:

  1. przeczytaj trzy dokumenty powiązane powyżej. (Tak ... Przeczytaj je. Jest to bardzo ważne, aby programista rozumiał przynajmniej podstawy działania mechanizmów Java classpath.)
  2. spójrz na linię poleceń i / lub zmienną środowiskową CLASSPATH, która działa po uruchomieniu polecenia java. Sprawdź, czy nazwy katalogów i plików JAR są poprawne.
  3. jeśli w ścieżce classpath sąwzględne , sprawdź, czy rozwiązują się poprawnie ... z bieżącego katalogu, który działa po uruchomieniu polecenia java.
  4. sprawdź, czy klasa (wymieniona w komunikacie o błędzie) może znajdować się na efektywnej classpath.
  5. zwróć uwagę, że składnia classpath jest Inna dla systemu Windows w porównaniu z Linuksem i Mac OS. (Separator classpath jest ; w systemie Windows i : W pozostałych.)

Powód # 2a - zły katalog jest na classpath

Kiedy umieszczając katalog na ścieżce classpath, teoretycznie odpowiada on katalogowi głównemu kwalifikowanej przestrzeni nazw. Klasy znajdują się w strukturze katalogów pod tym korzeniem, , mapując w pełni kwalifikowaną nazwę na ścieżkę . Na przykład, jeśli"/usr/local/acme / classes "znajduje się na ścieżce klas, to gdy JVM szuka klasy o nazwie com.acme.example.Foon, będzie szukał".Klasa " plik o tej ścieżce:

/usr/local/acme/classes/com/acme/example/Foon.class

Jeśli umieściłeś "/ usr / local / acme/classes/com/acme / example " na classpath, wtedy JVM nie będzie w stanie znaleźć klasy.

Powód # 2b - ścieżka podkatalogu nie pasuje do FQN

Jeśli Twoje klasy FQN są com.acme.example.Foon, to JVM będzie szukał " Foon.klasa "w katalogu" com / acme / example":

  • Jeśli struktura katalogów nie pasuje do nazw pakietów zgodnie z powyższym wzorem, JVM nie znajdzie twojej klasy.

  • Jeśli spróbujesz zmienić nazwę klasy, przesuwając ją, to się nie uda też ... ale wyjątek stacktrace będzie inny.

Podać konkretny przykład, zakładając, że:

  • chcesz prowadzić com.acme.example.Foon klasę,
  • pełna ścieżka do pliku to /usr/local/acme/classes/com/acme/example/Foon.class,
  • Twój bieżący katalog roboczy to /usr/local/acme/classes/com/acme/example/,

Potem:

# 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:

  • opcja -classpath może być skrócona do -cp w większości wydań Javy. Sprawdź odpowiednie wpisy podręcznika dla java, javac i tak on
  • zastanów się uważnie przy wyborze między bezwzględnymi i względnymi nazwami ścieżek w ścieżkach klasowych. Pamiętaj, że względna nazwa ścieżki może "pęknąć", jeśli bieżący katalog ulegnie zmianie.

Reason # 2c-dependencies missing from the classpath

Classpath musi zawierać wszystkie inne (nie-systemowe) klasy, od których zależy Twoja aplikacja. (Klasy systemowe znajdują się automatycznie i rzadko trzeba się tym martwić.) Dla głównego aby poprawnie załadować, JVM musi znaleźć:

  • klasa sama w sobie.
  • wszystkie klasy i interfejsy w hierarchii klasy nadrzędnej (np. zobacz to pytanie )
  • wszystkie klasy i interfejsy, do których odnoszą się deklaracje zmiennych lub zmiennych, wywołania metod lub wyrażenia dostępu do pól.

(Uwaga: specyfikacje JLS i JVM pozwalają JVM na ładowanie klas "leniwie" , co może mieć wpływ na to, gdy classloader wyjątek jest wyrzucany.)

Powód # 3-klasa została zadeklarowana w niewłaściwym pakiecie

Czasami zdarza się, że ktoś wrzuca plik kodu źródłowego do błędnego folderu w drzewie kodu źródłowego, lub pomijają deklarację package. Jeśli zrobisz to w IDE, kompilator IDE natychmiast ci o tym powie. Podobnie, jeśli używasz porządnego narzędzia do budowania Javy, narzędzie uruchomi się javac w sposób, który wykryje problem. Jeśli jednak zbudujesz swój kod Java ręcznie, można to zrobić w taki sposób, że kompilator nie zauważy problemu, a wynikowy".class " plik nie jest w miejscu, w którym go oczekujesz.

Nadal nie możesz znaleźć problemu?

Jest wiele rzeczy do sprawdzenia, i łatwo jest coś przeoczyć. Spróbuj dodać opcję -Xdiag do linii poleceń java (jako pierwszą rzecz po java). Wyświetli różne rzeczy na temat ładowania klas, a to może dać ci wskazówki, co jest prawdziwym problemem jest.

Rozważ również możliwe problemy spowodowane kopiowaniem i wklejaniem niewidocznych lub nie-ASCII znaków ze stron internetowych, dokumentów itp. I rozważyć "homoglify", były dwie litery lub symbole wyglądają tak samo ... ale nie są.


Składnia java -jar <jar file> ]}

Alternatywna składnia używana dla "wykonywalnych" plików JAR jest następująca:

java [ <option> ... ] -jar <jar-file-name> [<argument> ...]

Np.

java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

W tym przypadku podano nazwę klasy entry-point (tj. com.acme.example.ListUser) i classpath w manifeście pliku JAR.


IDEs

[55]}typowe Java IDE obsługuje uruchamianie aplikacji Java w samym IDE JVM lub w podrzędnym JVM. Są to ogólnie odporne na ten szczególny wyjątek, ponieważ IDE używa własnych mechanizmów do konstruowania runtime classpath, identyfikowania głównej klasy i tworzenia linii poleceń java.

Jednak nadal możliwe jest wystąpienie tego wyjątku, jeśli robisz rzeczy za plecami IDE. Na przykład, jeśli wcześniej skonfigurowałeś program uruchamiający dla swojej aplikacji Java w Eclipse, a następnie przenieś plik JAR zawierający klasę "main" do innego miejsca w systemie plików bez informowania Eclipse, Eclipse nieświadomie uruchomi JVM z nieprawidłową ścieżką klasową.

Krótko mówiąc, Jeśli pojawi się ten problem w IDE, sprawdź, czy nie ma stanu IDE, uszkodzonych odniesień do projektu lub uszkodzonych konfiguracji launchera.

Możliwe jest również dla IDE po prostu się pomylić. IDE to niezwykle skomplikowane oprogramowanie składające się z wielu oddziałujących ze sobą części. Wiele z tych części przyjmuje różne strategie buforowania, aby IDE jako całość reagowało. Czasami mogą się one nie udać, a jednym z możliwych objawów są problemy podczas uruchamiania aplikacji. Jeśli podejrzewasz, że to może się zdarzyć, warto ponownie uruchomić IDE.


Inne Referencje

 922
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-13 16:53:51

Jeśli Twój kod źródłowy to HelloWorld.java, Twój skompilowany kod będzie HelloWorld.class.

Otrzymasz ten błąd, jeśli wywołasz go za pomocą:

java HelloWorld.class

Zamiast tego użyj tego:

java HelloWorld
 190
Author: panoet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-04 14:06:24

Jeśli Twoje klasy znajdują się w pakietach, musisz cd przejść do głównego katalogu i uruchomić używając pełnej nazwy klasy (nazwa_pakietu.MainClassName).

Przykład:

Moje zajęcia są tutaj:

D:\project\com\cse\

Pełna nazwa mojej głównej klasy to:

com.cse.Main

Więc i cd powrót do katalogu głównego:

D:\project

Następnie wydaj java polecenie:

java com.cse.Main
 101
Author: tharinduwijewardane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-14 16:54:38

Jeśli Twoja główna metoda znajduje się w klasie pod pakietem, powinieneś uruchomić ją nad katalogiem hierarchicznym.

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, należy umieścić Main.Class w katalogu Typu Pakiet ./com/test/Main.Java. A w katalogu głównym użyj java com.test.Main.

 44
Author: M-Razavi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 17:32:03

Gdy ten sam kod działa na jednym komputerze, ale pokazuje błąd w innym, najlepszym rozwiązaniem, jakie kiedykolwiek znalazłem, jest kompilacja w następujący sposób:

javac HelloWorld.java
java -cp . HelloWorld
 36
Author: Enamul Hassan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-14 16:56:52

Pomogło mi podanie classpath w wierszu poleceń, na przykład:

  1. Utwórz nowy folder, C:\temp

  2. Utwórz plik Temp.java w C:\temp, z następującą klasą:

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
    
  3. Otwórz wiersz poleceń w folderze C:\temp i napisz następujące polecenie, aby skompilować klasę Temp:

    javac Temp.java
    
  4. Uruchom skompilowaną klasę Java, dodając opcję -classpath, aby JRE wiedział, gdzie znaleźć Klasa:

    java -classpath C:\temp Temp Hello!
    
 27
Author: Celebes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-14 16:51:55

Zgodnie z Komunikatem o błędzie ("Could not find or load main class"), istnieją dwie kategorie problemów:

    Nie można znaleźć
  1. klasy głównej
  2. główna klasa nie może być załadowana (ten przypadek nie jest w pełni omówiony w zaakceptowanej odpowiedzi)

Główna klasa nie może zostać znaleziona , gdy w pełni kwalifikowanej nazwie klasy występuje literówka lub błędna składnia lub nie istnieje w podanej ścieżce classpath .

Klasa główna nie można załadować Gdy klasa nie może zostać zainicjowana, zazwyczaj główna klasa rozszerza inną klasę i ta klasa nie istnieje w podanej ścieżce classpath.

Na przykład:

public class YourMain extends org.apache.camel.spring.Main

Jeśli camel-spring nie jest uwzględniony, ten błąd zostanie zgłoszony.

 21
Author: Xiao Peng - ZenUML.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 00:38:20

Czasami to, co może być przyczyną problemu, nie ma nic wspólnego z klasą główną, i musiałem się tego dowiedzieć na własnej skórze. To była biblioteka, którą przeniosłem i dała mi:

Nie można znaleźć lub załadować głównej klasy XXX Linux

Po prostu usunąłem to odniesienie, dodałem je ponownie, i znowu działało dobrze.

 12
Author: Eduardo Dennis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-14 16:49:21

Miałem taki błąd w tym przypadku:

java -cp lib.jar com.mypackage.Main

Działa z ; Dla Windows i : Dla Unix:

java -cp lib.jar; com.mypackage.Main
 12
Author: Yamahar1sp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-09 10:30:52

Użyj tego polecenia:

java -cp . [PACKAGE.]CLASSNAME

Przykład: jeśli Twoja nazwa klasy to Hello.Klasa utworzona z Hello.następnie użyj poniższego polecenia:

java -cp . Hello

If your file Hello.java jest w pakiecie com.demo następnie użyj poniższego polecenia

java -cp . com.demo.Hello

Z JDK 8 wielokrotnie zdarza się, że plik klasy znajduje się w tym samym folderze, ale polecenie java oczekuje classpath i z tego powodu dodajemy -cp . aby wziąć bieżący folder jako odniesienie dla classpath.

 12
Author: shaILU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 23:55:46

Try - Xdiag .

Odpowiedź Steve ' a C ładnie obejmuje możliwe przypadki, ale czasami ustalenie, czy klasa nie może byćznaleziona lubzaładowana , może nie być takie proste. Użyj java -Xdiag (od JDK 7). Wyświetla to ładną stacktrace, która podpowiada, co oznacza wiadomość Could not find or load main class.

Na przykład, może wskazać inne klasy używane przez klasę główną, których nie można znaleźć i uniemożliwić załadowanie klasy głównej.

 10
Author: jan.supol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 23:18:14

W tym przypadku masz:

Nie można znaleźć lub załadować głównej klasy ?classpath

To dlatego, że używasz "- classpath", ale myślnik nie jest tym samym myślnikiem używanym przez java w wierszu polecenia. Miałem ten problem kopiowanie i wklejanie z Notatnika do cmd.

 8
Author: Nathan Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-14 16:55:34

W moim przypadku pojawił się błąd, ponieważ podałem nazwę pliku źródłowego zamiast nazwy klasy.

Musimy dostarczyć interpreterowi nazwę klasy zawierającej główną metodę.

 6
Author: KawaiKx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 00:37:57

To może Ci pomóc, jeśli Twoja sprawa jest dokładnie taka jak moja: jako początkujący napotkałem ten problem, gdy próbowałem uruchomić program Java.

Skompilowałem to tak:

javac HelloWorld.java

I próbowałem uruchomić również z tym samym rozszerzeniem:

java Helloworld.java

Kiedy usunąłem .java i przepisałem polecenie tak jak java HelloWorld, program działał idealnie. :)

 6
Author: Ramesh Pareek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 23:53:28

Tutaj wpisz opis obrazka

Class file location: C:\test\com\company

Nazwa Pliku: Main.Klasa

Pełna nazwa klasy: com.Towarzystwo.Main

Command line command:

java  -classpath "C:\test" com.company.Main

Zauważ, że ścieżka klasy nie zawiera \com \ company

 5
Author: developer747,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-27 02:18:52

Jeśli używasz Maven do budowania pliku JAR, upewnij się, że podałeś główną klasę w pom.plik 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>
 5
Author: Junchen Liu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 23:52:16

Spędziłem sporo czasu próbując rozwiązać ten problem. Myślałem, że jakoś źle ustawiam moją classpath, 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   

Myślałem, że znaczenie fully qualified ma zawierać pełną nazwę ścieżki zamiast pełnej nazwy pakietu.

 5
Author: mathewbruens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-07 08:14:26

Najpierw ustaw ścieżkę używając tego polecenia;

set path="paste the set path address"

Następnie należy załadować program. Wpisz "cd (nazwa folderu)" w zapisanym napędzie i skompiluj go. Na przykład, jeśli mój program jest przechowywany na dysku D, wpisz "D:" naciśnij enter i wpisz " cd (nazwa folderu)".

 4
Author: arun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-02 14:33:34

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 albo naprawić istniejącą konfigurację, albo dodać nową w następujący sposób:

Otwórz zakładkę Classpath, Kliknij na przycisk Advanced..., a następnie dodaj bin folder twojego projektu.

 4
Author: syntagma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-16 10:26:31

Jest to konkretny przypadek, ale ponieważ przyszedłem na tę stronę szukając rozwiązania, a nie znalazłem go, dodam go tutaj.

Windows (testowany z 7) nie akceptuje znaków specjalnych (np. á) w nazwach klas i pakietów. Ale Linux tak.

Odkryłem to, gdy zbudowałem .jar w NetBeans i próbowałem uruchomić go w wierszu poleceń. Działał w NetBeans, ale nie w wierszu poleceń.

 3
Author: GuiRitter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-27 00:26:16

Wszystkie odpowiedzi są skierowane do użytkowników Windows, jak się wydaje. W przypadku komputerów Mac separatorem ścieżki klas jest :, a nie ;. Ponieważ błąd ustawienia classpath przy użyciu ; nie jest wyrzucany, może to być trudne do wykrycia, jeśli pochodzi z systemu Windows na Mac.

Oto odpowiednie polecenie Mac:

java -classpath ".:./lib/*" com.test.MyClass

Gdzie w tym przykładzie Pakiet jest com.test i folder lib ma być również dołączony do classpath.

 3
Author: blue-sky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-20 19:24:53

Podczas uruchamiania java z opcją -cp reklamowaną 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 PowerShell mógł zaakceptować polecenie, argumenty opcji -cp muszą być zawarte w cudzysłowach jak w:

java -cp 'someDependency.jar;.' ClassName

Utworzenie polecenia w ten sposób powinno pozwolić Javie poprawnie przetwarzać argumenty classpath.

 3
Author: Chezzwizz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-21 08:14:38

Czasami w niektórych kompilatorach internetowych, które mogłeś wypróbować, pojawi się ten błąd, jeśli nie napiszesz public class [Classname], ale po prostu class [Classname].

 3
Author: lor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-18 18:29:30

W porządku, już wiele odpowiedzi, ale nikt nie wspomniał o przypadku, w którym pozwolenie na plik może być winowajcą. Podczas uruchamiania użytkownik nie ma dostępu do pliku jar ani do jednego z katalogów ścieżki. Na przykład rozważ:

Plik Jar w /dir1/dir2/dir3/myjar.jar

User1 whow owners the jar may do:

# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar

Ale i tak nie działa:

# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram

Dzieje się tak dlatego, że uruchomiony użytkownik (User2) nie ma dostępu do dir1, dir2, javalibs lub dir3. To może doprowadzić kogoś do szału, gdy User1 może zobaczyć pliki i może uzyskać do nich dostęp, ale błąd nadal występuje dla User2

 3
Author: biocyberman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 12:33:35

W systemie Windows umieść .; Na początku wartości CLASSPATH.

The . (kropka) oznacza "zajrzyj do bieżącego katalogu". Jest to trwałe rozwiązanie.

Możesz również ustawić go "jeden raz" za pomocą set CLASSPATH=%CLASSPATH%;.. Będzie to trwało tak długo, jak długo okno cmd jest otwarte.

 2
Author: Nenad Bulatovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-20 19:12:33

Naprawdę musisz to zrobić z folderu src. Tam wpisujesz następujący wiersz poleceń:

[name of the package].[Class Name] [arguments]

Powiedzmy, że twoja klasa nazywa się CommandLine.class, A kod wygląda tak:

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 należy cd do folderu src, a komenda, którą trzeba uruchomić, będzie wyglądała tak:

java com.tutorialspoint.java.CommandLine this is a command line 200 -100

I wyjście z linii poleceń będzie:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
 2
Author: mdarmanin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-20 19:17:26

W moim przypadku, dostałem błąd, ponieważ miałem mieszane nazwy dużych i małych liter w systemie Windows 7. Zmiana nazw pakietów na wszystkie małe litery rozwiązała problem. Zauważ również, że w tym scenariuszu nie mam błędu kompilowania .plik java do a .plik klasy; po prostu nie będzie uruchamiany z tego samego (sub-sub-sub-) katalogu.

 2
Author: Howard007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-26 19:55:15

Napotkałem również podobne błędy podczas testowania połączenia Java MongoDB JDBC. Myślę, że dobrze jest podsumować moje ostateczne rozwiązanie w skrócie tak, że w przyszłości każdy może bezpośrednio spojrzeć na dwa polecenia i są dobre, aby przejść dalej.

Załóżmy, że znajdujesz się w katalogu, w którym istnieje Twój plik Java i zewnętrzne zależności (pliki JAR).

Compile:

javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -CP - argument classpath; przekazuje wszystkie zależne pliki JAR jeden przez one
  • *.java-jest to plik klasy Java, który ma główną metodę. sdsd

Run:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • proszę obserwować dwukropek (Unix) / przecinek (Windows) po zakończeniu wszystkich plików jar zależności
  • na końcu obserwuj główną nazwę klasy bez rozszerzenia (no .klasy lub .java)
 2
Author: khichar.anil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 23:21:13

Miałam dziwną.

Błąd: nie można znaleźć lub załadować głównej klasy mypackage.App

Okazało się, że mam zestaw pom (parent) w pom mojego projektu.xml (pom.xml wskazywał na macierzysty pom.xml) i relativePath był off/wrong.

Poniżej fragment pom mojego projektu.xml

<parent>
    <groupId>myGroupId</groupId>
    <artifactId>pom-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../badPathHere/pom.xml</relativePath>
</parent> 

Gdy rozwiązałem relativePath pom, błąd zniknął.

/ Align = "left" /
 2
Author: granadaCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 20:34:55

W Javie, gdy czasami uruchamiasz JVM z linii poleceń za pomocą programu wykonywalnego java i próbujesz uruchomić program z pliku klasy z publicznym static void main (PSVM), możesz napotkać poniższy błąd, nawet jeśli parametr classpath dla JVM jest dokładny, a plik klasy jest obecny na ścieżce classpath:

Error: main class not found or loaded

Dzieje się tak, gdy plik klasy z PSVM nie może zostać załadowany. Jednym z możliwych powodów jest to, że klasa może implementować interfejs lub rozszerzać kolejna klasa, która nie znajduje się na classpath. Zwykle, jeśli klasa nie znajduje się na ścieżce classpath, wyrzucony błąd wskazuje jako taki. Jeśli jednak używana klasa jest rozszerzona lub zaimplementowana, java nie jest w stanie załadować samej klasy.

Odniesienie: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/

 1
Author: Anandaraja Ravi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 03:01:01