it-swarm.com.de

Was bedeutet "Hauptklasse konnte nicht gefunden oder geladen werden"?

Ein häufiges Problem, das bei neuen Java Entwicklern auftritt, besteht darin, dass ihre Programme nicht mit der folgenden Fehlermeldung ausgeführt werden können: Could not find or load main class ...

Was bedeutet das, was verursacht es und wie sollten Sie es beheben?

1220
Stephen C

Die Java <class-name> Befehlssyntax

Zunächst müssen Sie wissen, wie ein Programm mit dem Befehl Java (oder javaw) korrekt gestartet werden kann.

Die normale Syntax1 ist das:

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

dabei ist <option> eine Befehlszeilenoption (beginnend mit einem "-" - Zeichen), <class-name> ein vollständig qualifizierter Klassenname Java und <argument> ein beliebiges Befehlszeilenargument das wird an Ihre Anwendung übergeben.
1 - Es gibt eine zweite Syntax für "ausführbare" JAR-Dateien, die ich unten beschreiben werde.

Der vollständig qualifizierte Name (FQN) für die Klasse wird wie im Quellcode Java geschrieben. z.B.

    packagename.packagename2.packagename3.ClassName

In einigen Versionen des Befehls Java können Sie jedoch Schrägstriche anstelle von Punkten verwenden. z.B.

    packagename/packagename2/packagename3/ClassName

das (verwirrenderweise) wie ein Dateipfad aussieht, aber keiner ist. Beachten Sie, dass der Begriff vollqualifizierter Name die Standardterminologie Java ist ... nicht etwas, das ich nur erfunden habe, um Sie zu verwirren :-)

Hier ist ein Beispiel, wie ein Java -Befehl aussehen sollte:

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

Das Obige bewirkt, dass der Befehl Java Folgendes ausführt:

  1. Suchen Sie nach der kompilierten Version der Klasse com.acme.example.ListUsers.
  2. Laden Sie die Klasse.
  3. Stellen Sie sicher, dass die Klasse eine main -Methode mit Signatur , Rückgabetyp und Modifikatoren = hat gegeben durch public static void main(String[]). (Beachten Sie, dass der Name des Methodenarguments NICHT Teil der Signatur ist.)
  4. Nennen Sie diese Methode, indem Sie die Befehlszeilenargumente ("fred", "joe", "bert") als String[] übergeben.

Gründe, warum Java die Klasse nicht finden kann

Wenn Sie die Meldung "Hauptklasse konnte nicht gefunden oder geladen werden ..." erhalten, bedeutet dies, dass der erste Schritt fehlgeschlagen ist. Der Befehl Java konnte die Klasse nicht finden. Das "..." in der Nachricht ist in der Tat der vollqualifizierte Klassenname , nach dem Java sucht.

Warum kann es also sein, dass die Klasse nicht gefunden wird?

Grund # 1 - Sie haben einen Fehler mit dem Argument Klassenname gemacht

Die erste mögliche Ursache ist, dass Sie möglicherweise den falschen Klassennamen angegeben haben. (Oder ... der richtige Klassenname, aber in der falschen Form.) In Anbetracht des obigen Beispiels gibt es hier eine Vielzahl von falschen Möglichkeiten , die Klasse anzugeben Name:

  • Beispiel # 1 - ein einfacher Klassenname:

    Java ListUser
    

    Wenn die Klasse in einem Paket wie com.acme.example deklariert ist, müssen Sie den vollständigen Klassennamen einschließlich im Befehl Java verwenden. z.B.

    Java com.acme.example.ListUser
    
  • Beispiel # 2 - ein Dateiname oder Pfadname anstelle eines Klassennamens:

    Java ListUser.class
    Java com/acme/example/ListUser.class
    
  • Beispiel # 3 - Ein Klassenname mit falscher Schreibweise:

    Java com.acme.example.listuser
    
  • Beispiel # 4 - ein Tippfehler

    Java com.acme.example.mistuser
    
  • Beispiel # 5 - Ein Quellendateiname

    Java ListUser.Java
    
  • Beispiel # 6 - Sie haben den Klassennamen komplett vergessen

    Java lots of arguments
    

Grund Nr. 2 - Der Klassenpfad der Anwendung wurde falsch angegeben

Die zweite wahrscheinliche Ursache ist, dass der Klassenname korrekt ist, der Befehl Java die Klasse jedoch nicht finden kann. Um dies zu verstehen, müssen Sie das Konzept des "Klassenpfads" verstehen. Dies wird well in der Oracle-Dokumentation erklärt:

Also ... wenn Sie den Klassennamen korrekt angegeben haben, müssen Sie als Nächstes überprüfen, ob Sie den Klassenpfad korrekt angegeben haben:

  1. Lesen Sie die drei oben verlinkten Dokumente. (Ja ... LESEN SIE SIE. Es ist wichtig, dass ein Java - Programmierer versteht zumindest die Grundlagen der Funktionsweise der Java - Klassenpfadmechanismen.)
  2. Sehen Sie sich die Befehlszeile und/oder die Umgebungsvariable CLASSPATH an, die beim Ausführen des Befehls Java wirksam ist. Überprüfen Sie, ob die Verzeichnisnamen und JAR-Dateinamen korrekt sind.
  3. Wenn der Klassenpfad relative Pfadnamen enthält, prüfen Sie, ob diese korrekt aufgelöst werden ... aus dem aktuellen Verzeichnis, das bei Ausführung des Befehls Java gültig ist.
  4. Vergewissern Sie sich, dass die in der Fehlermeldung erwähnte Klasse im Klassenpfad effective enthalten ist.
  5. Beachten Sie, dass die Klassenpfadsyntax für Windows im Vergleich zu Linux und Mac OS different lautet. (Das Klassenpfadtrennzeichen ist ; unter Windows und : unter den anderen. Wenn Sie das falsche Trennzeichen für Ihre Plattform verwenden, wird keine explizite Fehlermeldung angezeigt. Stattdessen wird eine nicht vorhandene Datei angezeigt oder Verzeichnis auf dem Pfad, das unbemerkt ignoriert wird.)

Grund # 2a - das falsche Verzeichnis befindet sich im Klassenpfad

Wenn Sie ein Verzeichnis in den Klassenpfad einfügen, entspricht es fiktiv dem Stamm des qualifizierten Namensraums. Klassen befinden sich in der Verzeichnisstruktur unter dem Stammverzeichnis ), indem der vollständig qualifizierte Name einem Pfadnamen zugeordnet wird . Wenn sich beispielsweise "/ usr/local/acme/classes" im Klassenpfad befindet, sucht die JVM nach einer Klasse mit dem Namen com.acme.example.Foon und sucht nach einer ".class" -Datei mit diesem Pfadnamen:

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

Wenn Sie "/ usr/local/acme/classes/com/acme/example" in den Klassenpfad aufgenommen hätten, könnte die JVM die Klasse nicht finden.

Grund # 2b - Der Pfad des Unterverzeichnisses stimmt nicht mit dem FQN überein

Wenn Ihre Klassen-FQN com.acme.example.Foon ist, sucht die JVM im Verzeichnis "com/acme/example" nach "Foon.class":

  • Wenn Ihre Verzeichnisstruktur nicht mit der Paketbenennung gemäß dem obigen Muster übereinstimmt, wird Ihre Klasse von der JVM nicht gefunden.

  • Wenn Sie versuchen, eine Klasse umzubenennen , indem Sie sie verschieben, schlägt dies ebenfalls fehl ... aber die Ausnahmestapelverfolgung ist anders. Es kann ungefähr so ​​lauten:

    Caused by: Java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
    

    weil der FQN in der Klassendatei nicht mit dem übereinstimmt, was der Klassenladeprogramm erwartet.

Um ein konkretes Beispiel zu geben:

  • sie möchten com.acme.example.Foon Klasse ausführen,
  • der vollständige Dateipfad ist /usr/local/acme/classes/com/acme/example/Foon.class,
  • ihr aktuelles Arbeitsverzeichnis ist /usr/local/acme/classes/com/acme/example/,

dann:

# 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

Anmerkungen:

  • Die Option -classpath kann in den meisten Java - Versionen auf -cp gekürzt werden. Überprüfen Sie die entsprechenden manuellen Einträge für Java, javac und so weiter.
  • Überlegen Sie sorgfältig, ob Sie in Klassenpfaden zwischen absoluten und relativen Pfadnamen wählen. Denken Sie daran, dass ein relativer Pfadname möglicherweise unterbrochen wird, wenn sich das aktuelle Verzeichnis ändert.

Grund # 2c - Abhängigkeiten fehlen im Klassenpfad

Der Klassenpfad muss alle Klassen other (non-system) enthalten, von denen Ihre Anwendung abhängt. (Die Systemklassen werden automatisch gefunden, und Sie müssen sich selten damit befassen.) Damit die Hauptklasse korrekt geladen werden kann, muss die JVM Folgendes ermitteln:

(Hinweis: Die JLS- und JVM-Spezifikationen ermöglichen es einer JVM, Klassen "träge" zu laden. Dies kann sich auf das Auslösen einer Classloader-Ausnahme auswirken.)

Grund # 3 - Die Klasse wurde im falschen Paket deklariert

Es kommt gelegentlich vor, dass jemand eine Quellcodedatei in den falschen Ordner seines Quellcodebaums legt oder die package -Deklaration weglässt. Wenn Sie dies in einer IDE tun, werden Sie vom IDE-Compiler sofort darüber informiert. Wenn Sie ein anständiges Build-Tool Java verwenden, führt das Tool javac auf eine Weise aus, die das Problem erkennt. Wenn Sie jedoch Ihren Java - Code von Hand erstellen, können Sie dies so tun, dass der Compiler das Problem nicht bemerkt und die resultierende ".class" -Datei nicht an der Stelle liegt, die Sie erwarten sein.

Können Sie das Problem immer noch nicht finden?

Es gibt viele Dinge zu überprüfen, und es ist leicht, etwas zu verpassen. Versuchen Sie, die Option -Xdiag in die Befehlszeile Java einzufügen (als erstes nach Java). Es gibt verschiedene Dinge über das Laden von Klassen aus, und dies kann Ihnen Hinweise darauf geben, was das eigentliche Problem ist.

Berücksichtigen Sie auch mögliche Probleme beim Kopieren und Einfügen von unsichtbaren oder Nicht-ASCII-Zeichen von Websites, Dokumenten usw. Und denken Sie an "Homoglyphen", wenn zwei Buchstaben oder Symbole gleich aussehen ... aber nicht.


Die Java -jar <jar file> -Syntax

Die alternative Syntax für "ausführbare" JAR-Dateien lautet wie folgt:

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

z.B.

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

In diesem Fall werden der Name der Einstiegspunktklasse (d. H. com.acme.example.ListUser) und der Klassenpfad im MANIFEST der JAR-Datei angegeben.


IDEs

Ein typisches Java IDE unterstützt das Ausführen von Java - Anwendungen in der IDE - JVM selbst oder in einer untergeordneten JVM. Diese sind im Allgemeinen immun gegen diese spezielle Ausnahme, da die IDE ihre eigenen Mechanismen verwendet, um den Laufzeitklassenpfad zu erstellen, die Hauptklasse zu identifizieren und die Java zu erstellen. Befehlszeile.

Es ist jedoch weiterhin möglich, dass diese Ausnahme auftritt, wenn Sie Aufgaben hinter der IDE ausführen. Wenn Sie beispielsweise zuvor in Eclipse einen Application Launcher für Ihre Java - App eingerichtet haben und anschließend die JAR-Datei mit der Klasse "main" an eine andere Stelle im Dateisystem verschoben haben ) Ohne Eclipse mitzuteilen, würde Eclipse die JVM unwissentlich mit einem falschen Klassenpfad starten.

Kurz gesagt, wenn dieses Problem in einer IDE auftritt, überprüfen Sie, ob der Status IDE veraltet ist, die Projektreferenzen nicht mehr funktionieren oder die Launcher-Konfigurationen nicht mehr funktionieren.

Es ist auch möglich, dass eine IDE einfach verwirrt wird. IDEs sind äußerst komplizierte Software-Teile, die aus vielen interagierenden Teilen bestehen. Viele dieser Teile verwenden verschiedene Caching-Strategien, um das IDE als Ganzes ansprechbar zu machen. Diese können manchmal schief gehen und ein mögliches Symptom sind Probleme beim Starten von Anwendungen. Wenn Sie vermuten, dass dies passiert, lohnt es sich, die IDE neu zu starten.


Weitere Referenzen

1113
Stephen C

Wenn Ihr Quellcode HelloWorld.Java heißt, lautet Ihr kompilierter Code HelloWorld.class.

Sie erhalten diesen Fehler, wenn Sie ihn folgendermaßen aufrufen:

Java HelloWorld.class

Verwenden Sie stattdessen Folgendes:

Java HelloWorld
221
panoet

Wenn sich Ihre Klassen in Paketen befinden Dann müssen Sie cd in das Stammverzeichnis Ihres Projekts und unter Verwendung des vollständig qualifizierten Namens der Klasse (packageName.MainClassName) ausführen.

Beispiel:

Meine Klassen sind hier:

D:\project\com\cse\

Der vollständig qualifizierte Name meiner Hauptklasse lautet:

com.cse.Main

Also ich cd zurück in das Root-Projektverzeichnis:

D:\project

Geben Sie dann den Befehl Java ein:

Java com.cse.Main

Diese Antwort soll neue Java Programmierer vor der Frustration retten, die durch einen häufigen Fehler verursacht wird. Ich empfehle Ihnen, die akzeptierte Antwort zu lesen, um detailliertere Kenntnisse über den Java - Klassenpfad zu erhalten .

127

Wenn Sie die Hauptklasse und die Hauptmethode in einem package definieren, sollten Sie sie mit dem vollständigen Namen der Klasse (packageName.MainClassName) über das hierarchische Verzeichnis ausführen.

Angenommen, es gibt eine Quellcodedatei (Main.Java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

Um diesen Code auszuführen, sollten Sie Main.Class in das Paketverzeichnis ./com/test/Main.Java einfügen. Und im Stammverzeichnis verwenden Sie Java com.test.Main.

53
M-Razavi

Wenn derselbe Code auf einem PC funktioniert, der Fehler jedoch auf einem anderen angezeigt wird, ist die beste Lösung, die ich je gefunden habe, das Kompilieren wie folgt:

javac HelloWorld.Java
java -cp . HelloWorld
41
Enamul Hassan

Was mir geholfen hat, war die Angabe des Klassenpfads in der Befehlszeile, zum Beispiel:

  1. Erstellen Sie einen neuen Ordner, C:\temp

  2. Erstellen Sie die Datei Temp.Java in C:\temp mit der folgenden Klasse:

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
    
  3. Öffnen Sie eine Befehlszeile im Ordner C:\temp und schreiben Sie den folgenden Befehl, um die Temp-Klasse zu kompilieren:

    javac Temp.Java
    
  4. Führen Sie die kompilierte Klasse Java aus und fügen Sie die Option -classpath hinzu, um JRE mitzuteilen, wo sich die Klasse befindet:

    Java -classpath C:\temp Temp Hello!
    
34
Celebes

Laut der Fehlermeldung ("Hauptklasse konnte nicht gefunden oder geladen werden") gibt es zwei Kategorien von Problemen:

  1. Hauptklasse konnte nicht gefunden sein
  2. Hauptklasse konnte nicht geladen sein (dieser Fall wird in der akzeptierten Antwort nicht vollständig erörtert)

Die Hauptklasse konnte nicht gefunden sein, wenn Tippfehler oder falsche Syntax im vollständig qualifizierten Klassennamen oder existiert nicht im angegebenen Klassenpfad.

Die Hauptklasse konnte nicht geladen sein, wenn die Klasse kann nicht initiiert werden, normalerweise erweitert die Hauptklasse eine andere Klasse und diese Klasse existiert nicht im angegebenen Klassenpfad.

Zum Beispiel:

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

Wenn die Kamelfeder nicht enthalten ist, wird dieser Fehler gemeldet.

Ich hatte in diesem Fall einen solchen Fehler:

Java -cp lib.jar com.mypackage.Main

Es funktioniert mit ; für Windows und : für Unix:

Java -cp lib.jar; com.mypackage.Main
16
Yamahar1sp

Manchmal hat das, was das Problem verursachen könnte, nichts mit der Hauptklasse zu tun, und ich musste es auf die harte Tour herausfinden. Es war eine referenzierte Bibliothek, die ich umgezogen habe und die mir Folgendes gab:

Hauptklasse xxx Linux konnte nicht gefunden oder geladen werden

Ich habe diesen Verweis gerade gelöscht, wieder hinzugefügt und es hat wieder gut funktioniert.

15
Eduardo Dennis

Verwenden Sie diesen Befehl:

_Java -cp . [PACKAGE.]CLASSNAME
_

Beispiel: Wenn Ihr Klassenname Hello.class ist, der aus Hello.Java erstellt wurde, verwenden Sie den folgenden Befehl:

_Java -cp . Hello
_

Wenn sich Ihre Datei Hello.Java im Paket com.demo befindet, verwenden Sie den folgenden Befehl

_Java -cp . com.demo.Hello
_

In JDK 8 kommt es häufig vor, dass sich die Klassendatei im selben Ordner befindet, aber der Befehl Java erwartet den Klassenpfad. Aus diesem Grund fügen wir -cp . hinzu, um den aktuellen zu ermitteln Ordner als Referenz für Klassenpfad.

14
shaILU

Try - Xdiag .

Steve Cs Antwort deckt die möglichen Fälle gut ab, aber manchmal ist es nicht so einfach zu bestimmen, ob die Klasse nicht gefunden oder geladen sein könnte. Verwenden Sie Java -Xdiag (seit JDK 7). Hiermit wird ein Nice-Stacktrace ausgedruckt, das einen Hinweis darauf gibt, was die Nachricht Could not find or load main class bedeutet.

Beispielsweise kann es Sie auf andere Klassen verweisen, die von der Hauptklasse verwendet wurden, die nicht gefunden wurden, und das Laden der Hauptklasse verhindern.

13
jan.supol

In diesem Fall haben Sie:

Hauptklasse konnte nicht gefunden oder geladen werden ? Klassenpfad

Dies liegt daran, dass Sie "-classpath" verwenden, der Bindestrich jedoch nicht mit dem Bindestrich identisch ist, der von Java in der Eingabeaufforderung verwendet wird. Ich hatte dieses Problem beim Kopieren und Einfügen von Notepad nach cmd.

9
Nathan Williams

In meinem Fall trat ein Fehler auf, weil ich anstelle des Klassennamens den Namen der Quelldatei angegeben hatte.

Wir müssen den Klassennamen, der die Hauptmethode enthält, an den Interpreter übergeben.

7
KawaiKx

Ich hatte das gleiche Problem und fand schließlich meinen Fehler :) Ich habe diesen Befehl zum Kompilieren verwendet und es hat richtig funktioniert.

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

aber dieser Befehl hat bei mir nicht funktioniert (Hauptklasse qrcode konnte nicht gefunden oder geladen werden)

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

Schließlich habe ich am Ende des Klassenpfads das Zeichen ':' hinzugefügt und das Problem behoben.

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

)

7
Omid Mohebbi

Ich habe ziemlich viel Zeit damit verbracht, dieses Problem zu lösen. Ich dachte, dass ich irgendwie meinen Klassenpfad falsch eingestellt habe, aber das Problem war, dass ich Folgendes eingegeben habe:

Java -cp C:/Java/MyClasses C:/Java/MyClasses/utilities/myapp/Cool  

anstatt von:

Java -cp C:/Java/MyClasses utilities/myapp/Cool   

Ich dachte, die Bedeutung von "vollständig qualifiziert" soll den vollständigen Pfadnamen anstelle des vollständigen Paketnamens enthalten.

6
mathewbruens

enter image description here

Speicherort der Klassendatei: C:\test\com\company

Dateiname: Hauptklasse

Vollständig qualifizierter Klassenname: com.company.Main

Befehlszeilenbefehl:

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

Beachten Sie hier, dass der Klassenpfad NICHT\com\company enthält

6
developer747

Dies könnte Ihnen helfen, wenn Ihr Fall speziell meinem ähnelt: Als Anfänger bin ich auch auf dieses Problem gestoßen, als ich versuchte, ein Programm Java auszuführen.

Ich habe es so zusammengestellt:

javac HelloWorld.Java

Und ich habe versucht, auch mit der gleichen Erweiterung zu laufen:

Java Helloworld.Java

Als ich den .Java entfernte und den Befehl wie Java HelloWorld umschrieb, lief das Programm perfekt. :)

6
Ramesh Pareek

Was das Problem in meinem Fall behoben hat, war:

Klicken Sie mit der rechten Maustaste auf das Projekt/die Klasse, das/die Sie ausführen möchten, und klicken Sie dann auf Run As-> Run Configurations. Dann sollten Sie entweder Ihre bestehende Konfiguration korrigieren oder auf folgende Weise neue hinzufügen:

öffnen Sie die Registerkarte Classpath, klicken Sie auf die Schaltfläche Advanced... und fügen Sie bin Ordner Ihres Projekts hinzu.

5
syntagma

Alle Antworten hier richten sich an Windows-Benutzer. Für Mac ist das Klassenpfadtrennzeichen :, nicht ;. Da beim Festlegen des Klassenpfads mit ; ein Fehler aufgetreten ist, kann dies schwierig sein, wenn Sie von Windows zu Mac wechseln.

Hier ist der entsprechende Mac-Befehl:

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

Wobei in diesem Beispiel das Paket com.test ist und ein lib -Ordner ebenfalls im Klassenpfad enthalten sein soll.

5
blue-sky

Stellen Sie zuerst den Pfad mit diesem Befehl ein.

set path="paste the set path address"

Dann müssen Sie das Programm laden. Geben Sie "cd (folder name)" in das gespeicherte Laufwerk ein und kompilieren Sie es. Wenn beispielsweise mein Programm auf dem Laufwerk D gespeichert ist, geben Sie "D:" ein, drücken Sie die Eingabetaste und geben Sie "cd (Ordnername)" ein.

5
arun

Wenn Sie zum Erstellen der JAR-Datei Maven verwenden, müssen Sie die Hauptklasse in der Datei pom.xml angeben:

<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
Junchen Liu

Unter Windows setzen Sie .; am Anfang auf den Wert CLASSPATH.

Das . (Punkt) bedeutet "im aktuellen Verzeichnis suchen". Dies ist eine dauerhafte Lösung.

Sie können es auch mit set CLASSPATH=%CLASSPATH%;. "einmalig" einstellen. Dies wird so lange dauern, wie Ihr cmd-Fenster geöffnet ist.

4
Nenad Bulatovic

Dies ist ein spezieller Fall, aber da ich auf dieser Seite nach einer Lösung gesucht habe und diese nicht gefunden habe, werde ich sie hier hinzufügen.

Windows (getestet mit 7) akzeptiert keine Sonderzeichen (wie á) in Klassen- und Paketnamen. Linux jedoch schon.

Das habe ich herausgefunden, als ich in NetBeans einen .jar erstellt und versucht habe, ihn in der Befehlszeile auszuführen. Es lief in NetBeans, aber nicht in der Befehlszeile.

4
GuiRitter

Sie müssen dies wirklich aus dem Ordner src heraus tun. Dort geben Sie folgende Kommandozeile ein:

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

Nehmen wir an, Ihre Klasse heißt CommandLine.class und der Code sieht folgendermaßen aus:

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]);
            }
        }
    }

Dann sollten Sie cd in den Ordner src und der Befehl, den Sie ausführen müssen, so aussehen:

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

Und die Ausgabe in der Befehlszeile wäre:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
3
mdarmanin

In einigen Online-Compilern, die Sie möglicherweise ausprobiert haben, wird dieser Fehler manchmal angezeigt, wenn Sie nicht public class [Classname], sondern nur class [Classname] schreiben.

3
lor

Wenn Sie Java mit der in Windows PowerShell angekündigten Option -cp ausführen, wird möglicherweise eine Fehlermeldung angezeigt, die ungefähr so ​​aussieht:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

Damit PowerShell den Befehl annehmen kann, müssen die Argumente der Option -cp in Anführungszeichen wie folgt enthalten sein:

Java -cp 'someDependency.jar;.' ClassName

Wenn Sie den Befehl auf diese Weise bilden, sollte Java die Klassenpfadargumente korrekt verarbeiten können.

3
Chezzwizz

Beim Testen einer Java MongoDB-JDBC-Verbindung sind ähnliche Fehler aufgetreten. Ich denke, es ist gut, meine endgültige Lösung kurz zusammenzufassen, damit in Zukunft jeder direkt in die beiden Befehle hineinschauen und weiter vorgehen kann.

Angenommen, Sie befinden sich in dem Verzeichnis, in dem Ihre Java -Datei und externe Abhängigkeiten (JAR-Dateien) vorhanden sind.

Compile:

javac -cp mongo-Java-driver-3.4.1.jar JavaMongoDBConnection.Java
  • - cp - classpath argument; Übergeben Sie alle abhängigen JAR-Dateien nacheinander
  • * .Java - Dies ist die Klassendatei Java mit der Hauptmethode. sdsd

Ausführen:

Java -cp mongo-Java-driver-3.4.1.jar: JavaMongoDBConnection
  • Bitte beachten Sie den Doppelpunkt (Unix)/Komma (Windows), nachdem alle JAR-Dateien für Abhängigkeiten beendet sind
  • Beobachten Sie am Ende den Hauptklassennamen ohne Erweiterung (keine .class oder .Java)
3
khichar.anil

In Ordnung, viele Antworten bereits, aber niemand erwähnte den Fall, in dem die Erlaubnis zur Einreichung von Dateien der Schuldige sein kann. Beim Ausführen hat der Benutzer keinen Zugriff auf die JAR-Datei oder eines der Verzeichnisse des Pfads. Zum Beispiel betrachten:

Jar-Datei in /dir1/dir2/dir3/myjar.jar

Benutzer1, dem das Glas gehört, darf:

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

Aber es funktioniert immer noch nicht:

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

Dies liegt daran, dass der aktive Benutzer (Benutzer2) keinen Zugriff auf dir1, dir2 oder javalibs oder dir3 hat. Es kann jemanden verrückt machen, wenn Benutzer1 die Dateien sehen und auf sie zugreifen kann, aber der Fehler tritt immer noch bei Benutzer2 auf

3
biocyberman

In meinem Fall erhielt ich den Fehler, weil ich UPPER- und Kleinbuchstaben auf einem Windows 7-System gemischt hatte. Durch Ändern der Paketnamen in Kleinbuchstaben wurde das Problem behoben. Beachten Sie auch, dass in diesem Szenario kein Fehler beim Kompilieren der .Java-Datei in eine .class-Datei aufgetreten ist. Es würde einfach nicht von demselben (sub-sub-sub-) Verzeichnis ausgeführt werden.

2
Howard007

Wenn Sie in Java die JVM manchmal über die Befehlszeile mit der ausführbaren Datei Java ausführen und versuchen, ein Programm aus einer Klassendatei mit Public Static Void Main (PSVM) zu starten, tritt möglicherweise der folgende Fehler auf Auch wenn der Parameter classpath für die JVM korrekt ist und die Klassendatei im Klassenpfad vorhanden ist:

Error: main class not found or loaded

Dies passiert, wenn die Klassendatei mit PSVM nicht geladen werden konnte. Ein möglicher Grund dafür ist, dass die Klasse möglicherweise eine Schnittstelle implementiert oder eine andere Klasse erweitert, die sich nicht im Klassenpfad befindet. Befindet sich eine Klasse nicht im Klassenpfad, wird dies normalerweise durch einen Fehler angezeigt. Wenn die verwendete Klasse jedoch erweitert oder implementiert ist, kann Java die Klasse selbst nicht laden.

Referenz: https://www.computingnotes.net/Java/error-main-class-not-found-or-loaded/

2
Anandaraja Ravi

Ich konnte dieses Problem mit den hier angegebenen Lösungen nicht lösen (obwohl die angegebene Antwort ohne Zweifel meine Konzepte geklärt hat). Ich war zweimal mit diesem Problem konfrontiert und habe jedes Mal andere Lösungen ausprobiert (in der Eclipse-IDE).

  • Erstens bin ich in verschiedenen Klassen meines Projekts auf mehrere main Methoden gestoßen. Also hatte ich die Methode main aus nachfolgenden Klassen gelöscht.
  • Zweitens habe ich folgende Lösung ausprobiert:
    1. Klicken Sie mit der rechten Maustaste auf mein Hauptprojektverzeichnis.
    2. Gehen Sie zur Quelle, räumen Sie auf und behalten Sie die Standardeinstellungen bei und klicken Sie auf Fertig stellen. Nach einigen Hintergrundaufgaben werden Sie zu Ihrem Hauptprojektverzeichnis weitergeleitet.
    3. Danach schließe ich mein Projekt, öffne es wieder und boom, ich habe endlich mein Problem gelöst.
2
Anus Kaleem

Ich hatte eine komische.

Fehler: Hauptklasse mypackage.App konnte nicht gefunden oder geladen werden

Es stellte sich heraus, dass ich in der pom.xml meines Projekts eine übergeordnete Konfiguration hatte (die pom.xml meines Projekts zeigte auf eine übergeordnete pom.xml) und der relativePath war aus/falsch.

Unten ist ein Teil der pom.xml meines Projekts

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

Sobald ich den pom relativePath behoben hatte, verschwand der Fehler.

Stelle dir das vor.

2
granadaCoder

Ich habe diese Fehlermeldung erhalten, nachdem ich mvn Eclipse:eclipse ausgeführt habe. Dies hat meine .classpath -Datei ein wenig durcheinander gebracht.

Musste die Zeilen in .classpath von ändern

<classpathentry kind="src" path="src/main/Java" including="**/*.Java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.Java"/>

zu

<classpathentry kind="src" path="src/main/Java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />
2
Jaanus

Manchmal ist es besser, die hinzugefügten JAR-Dateien zu entfernen und sie mit geeigneten Build-Hilfen erneut hinzuzufügen. Für mich war es ein regelmäßiges Problem und ich verfolgte den gleichen Ansatz:

  1. Legen Sie alle referenzierten JAR-Dateien in einen Ordner, jarAddOns, und kopieren Sie ihn an einen sicheren Ort
  2. Entfernen Sie nun von Eclipse (oder von Ihrer IDE) die JAR-Dateien.
  3. Verschieben Sie den gesamten Projektordner vom Arbeitsbereich an einen sicheren Ort
  4. Starten Sie Eclipse (Ihre IDE) neu
  5. Importieren Sie nun Ihr Projektverzeichnis vom sicheren Ort.
  6. Fügen Sie die JAR-Dateien aus dem jarAddOns-Ordner (zuvor an einem sicheren Ort gespeichert) in Ihr Projekt hinzu.
  7. Projekterstellungspfad, JAR-Dateien hinzufügen und anwenden
  8. Führen Sie nun das Projekt aus. Der Fehler sollte nicht angezeigt werden.

Wenn dieses Problem mit Eclipse zusammenhängt:

Versuchen Sie, Ihrem Klassenpfad ein Projekt hinzuzufügen.

siehe Bild unten:

enter image description here

Diese Methode hat bei mir funktioniert.

1
Tunde Pizzle

Im Kontext der IDE -Entwicklung (Eclipse, NetBeans oder was auch immer) müssen Sie Ihre Projekteigenschaften so konfigurieren, dass eine Hauptklasse vorhanden ist, damit Ihre IDE weiß, wo sich die Hauptklasse befindet ausgeführt werden, wenn Sie "Play" drücken.

  1. Rechtsklicke dein Projekt und dann Eigenschaften
  2. Gehen Sie zur Kategorie "Ausführen" und wählen Sie Ihre Hauptklasse aus
  3. Schlagen Sie die Run Taste.

Enter image description here

1
cepix

Das ist mir auch passiert. In meinem Fall passierte dies nur, wenn eine HttpServlet -Klasse im Quellcode vorhanden war (die Idea Intellij hat keinen Fehler bei der Kompilierung verursacht, das Servlet-Paket wurde einwandfrei importiert, aber zur Laufzeit gab es diese main class error).

Ich habe es geschafft, es zu lösen. Ich ging zu Datei - Projektstruktur:

enter image description here

Dann zu den Modulen:

enter image description here

In der Nähe des Servlet-Moduls befand sich ein Bereitstellungsbereich. Ich habe es in Kompilieren geändert:

enter image description here

Und es hat funktioniert!

0
parsecer

Standardmäßig verwendet Java ., das aktuelle Arbeitsverzeichnis, als Standard CLASSPATH. Wenn Sie an der Eingabeaufforderung einen Befehl eingeben, z. Java MyClass, der Befehl wird so interpretiert, als hätten Sie Java -cp . MyClass eingegeben. Haben Sie diesen Punkt zwischen -cp und MyClass gesehen? (cp ist kurz für die längere classpath Option)

Dies ist in den meisten Fällen ausreichend, und es scheint, als ob alles einwandfrei funktioniert, bis Sie irgendwann versuchen, Ihrem CLASSPATH ein Verzeichnis hinzuzufügen. In den meisten Fällen führen Programmierer dazu einfach einen Befehl wie set CLASSPATH=path\to\some\dir aus. Dieser Befehl erstellt eine neue Umgebungsvariable mit dem Namen CLASSPATH mit dem Wert path\to\some\dir oder ersetzt ihren Wert durch path\to\some\dir, wenn CLASSPATH bereits zuvor festgelegt wurde.

In diesem Fall haben Sie jetzt eine CLASSPATH -Umgebungsvariable und Java verwendet nicht mehr den Standardklassenpfad (.), sondern den von Ihnen festgelegten. Also schreiben Sie am nächsten Tag, wenn Sie Ihren Editor öffnen, ein Java Programm, cd in das Verzeichnis, in dem Sie es gespeichert haben, kompilieren es und versuchen es mit dem Befehl Java MyClass auszuführen. und Sie werden mit einer netten Ausgabe begrüßt: Konnte Hauptklasse nicht finden oder laden ... (Wenn Ihre Befehle funktionierten lange vorher und Sie bekommen jetzt diese Ausgabe, dann könnte dies für Sie der Fall sein).

Wenn Sie den Befehl Java MyClass ausführen, sucht Java nach der Klassendatei MyClass in dem Verzeichnis oder den Verzeichnissen, die Sie in Ihrem CLASSPATH und festgelegt haben nicht Ihr aktuelles Arbeitsverzeichnis, daher findet es Ihre Klassendatei dort nicht und beschwert sich daher.

Dazu müssen Sie Ihrem Klassenpfad erneut . hinzufügen, was mit dem Befehl set CLASSPATH=%CLASSPATH%;. geschehen kann (beachten Sie den Punkt nach dem Semikolon). Im Klartext sagt dieser Befehl: "Wählen Sie, was ursprünglich der Wert von CLASSPATH (%CLASSPATH%) war, fügen Sie . hinzu (;.) und weisen Sie das Ergebnis wieder CLASSPATH".

Und voila , Sie können Ihren Befehl Java MyClass wieder wie gewohnt verwenden.

0
Robert Odoch