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

1370

Ein häufiges Problem, das neue Java-Entwickler haben, ist, dass ihre Programme nicht mit der 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?

Stephen C.
quelle
37
Bitte beachten Sie, dass dies eine "Selbstantwort" -Frage ist, die als allgemeine Referenz-Q & A für neue Java-Benutzer gedacht ist. Ich konnte keine bestehenden Fragen und Antworten finden, die dies angemessen abdecken (IMO).
Stephen C

Antworten:

1230

Die java <class-name>Befehlssyntax

Zunächst müssen Sie wissen, wie Sie ein Programm mit dem Programm richtig starten javajavaw Befehl (oder ) .

Die normale Syntax 1 lautet:

    java [ <options> ] <class-name> [<arg> ...]

Dabei <option>handelt es sich um eine Befehlszeilenoption (beginnend mit einem "-"), <class-name>einen vollständig qualifizierten Java-Klassennamen und <arg>ein beliebiges Befehlszeilenargument, das an Ihre Anwendung übergeben wird.


1 - Es gibt einige andere Syntaxen, die am Ende dieser Antwort beschrieben werden.

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

    packagename.packagename2.packagename3.ClassName

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

    packagename/packagename2/packagename3/ClassName

das (verwirrenderweise) wie ein Dateipfadname aussieht, aber keiner ist. Beachten Sie, dass der Begriff vollqualifizierter Name" die Standard-Java-Terminologie ist ... nicht etwas, das ich mir nur ausgedacht habe, um Sie zu verwirren :-)

Hier ist ein Beispiel, wie ein javaBefehl aussehen sollte:

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

Das obige wird das verursachen java Befehl Folgendes ausführt:

  1. Suchen Sie nach der kompilierten Version des com.acme.example.ListUsers Klasse.
  2. Laden Sie die Klasse.
  3. Überprüfen Sie, ob die Klasse über eine mainMethode mit Signatur , Rückgabetyp und verfügt Modifikatoren von verfügt public static void main(String[]). (Beachten Sie, dass der Name des Methodenarguments NICHT lautet Teil der Signatur ist.)
  4. Nennen Sie diese Methode die Befehlszeilenargumente ("fred", "joe", "bert") als String[].

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 javaBefehl konnte die Klasse nicht finden. Tatsächlich ist das "..." in der Nachricht der vollständig qualifizierte Klassenname , javanach dem gesucht wird.

Warum kann es also nicht möglich sein, die Klasse zu finden?

Grund Nr. 1 - Sie haben einen Fehler mit dem Klassennamenargument gemacht

Die erste wahrscheinliche 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 verschiedene falsche Möglichkeiten , den Klassennamen anzugeben:

  • Beispiel 1 - ein einfacher Klassenname:

    java ListUser

    Wenn die Klasse in einem Paket wie deklariert ist com.acme.example, müssen Sie den vollständigen Klassennamen einschließlich des Paketnamens im javaBefehl 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 falschem Gehäuse:

    java com.acme.example.listuser
  • Beispiel 4 - ein Tippfehler

    java com.acme.example.mistuser
  • Beispiel 5 - ein Quelldateiname (außer Java 11 oder höher; siehe unten)

    java ListUser.java
  • Beispiel 6 - Sie haben den Klassennamen vollständig vergessen

    java lots of arguments

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

Die zweite wahrscheinliche Ursache ist, dass der Klassenname korrekt ist, der javaBefehl die Klasse jedoch nicht finden kann. Um dies zu verstehen, müssen Sie das Konzept des "Klassenpfades" verstehen. Dies erklärt sich auch durch die Oracle - Dokumentation:

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, wie die Java Classpath Mechanismen funktionieren.)
  2. Sehen Sie sich die Befehlszeile und / oder die Umgebungsvariable CLASSPATH an, die beim Ausführen des javaBefehls wirksam ist . Überprüfen Sie, ob die Verzeichnisnamen und JAR-Dateinamen korrekt sind.
  3. Wenn der Klassenpfad relative Pfadnamen enthält, überprüfen Sie, ob diese korrekt aufgelöst werden ... aus dem aktuellen Verzeichnis, das beim Ausführen des javaBefehls gültig ist.
  4. Überprüfen Sie, ob sich die Klasse (in der Fehlermeldung angegeben) im effektiven Klassenpfad befindet.
  5. Beachten Sie, dass die Classpath - Syntax ist unterschiedlich für Windows im Vergleich zu Linux und Mac OS. (Das Klassenpfadtrennzeichen befindet sich ;unter Windows und :unter den anderen. Wenn Sie das falsche Trennzeichen für Ihre Plattform verwenden, wird keine explizite Fehlermeldung angezeigt. Stattdessen erhalten Sie eine nicht vorhandene Datei oder ein nicht vorhandenes Verzeichnis auf dem Pfad, das unbemerkt ignoriert wird .)

Grund Nr. 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 diesem Stammverzeichnis, indem der vollständig qualifizierte Name einem Pfadnamen zugeordnet wird . Wenn sich beispielsweise "/ usr / local / acme / classes" im Klassenpfad befindet, sucht die JVM beim Suchen nach einer aufgerufenen Klasse com.acme.example.Foonnach 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 eingefügt hätten, könnte die JVM die Klasse nicht finden.

Grund Nr. 2b - Der Unterverzeichnispfad stimmt nicht mit dem FQN überein

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

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

  • Wenn Sie versuchen , eine Klasse durch Verschieben umzubenennen , schlägt dies ebenfalls fehl. Die Ausnahme-Stacktrace ist jedoch anders. Es kann so etwas sagen:

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

    weil der FQN in der Klassendatei nicht mit dem übereinstimmt, was der Klassenlader erwartet zu finden.

Um ein konkretes Beispiel zu geben, vorausgesetzt:

  • du willst com.acme.example.FoonKlasse laufen lassen ,
  • Der vollständige Dateipfad lautet /usr/local/acme/classes/com/acme/example/Foon.class:
  • Ihr aktuelles Arbeitsverzeichnis lautet /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 -classpathOption kann -cpin den meisten Java-Versionen verkürzt werden . Überprüfen Sie die entsprechenden manuellen Eingaben für java, javacund so weiter.
  • Überlegen Sie genau, ob Sie in Klassenpfaden zwischen absoluten und relativen Pfadnamen wählen. Denken Sie daran, dass ein relativer Pfadname möglicherweise "kaputt geht", wenn sich das aktuelle Verzeichnis ändert.

Grund # 2c - Abhängigkeiten fehlen im Klassenpfad

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

(Hinweis: Die JLS- und JVM-Spezifikationen ermöglichen es einer JVM, Klassen "träge" zu laden. Dies kann sich auswirken, wenn eine Classloader-Ausnahme ausgelöst wird.)

Grund Nr. 3 - Die Klasse wurde im falschen Paket deklariert

Es kommt gelegentlich vor, dass jemand eine Quellcodedatei in den falschen Ordner in seinem Quellcodebaum legt oder die packageDeklaration weglässt. Wenn Sie dies in einer IDE tun, werden Sie vom Compiler der IDE sofort darüber informiert. Wenn Sie ein anständiges Java-Build-Tool verwenden, wird das Tool javacauf eine Weise ausgeführt, die das Problem erkennt. Wenn Sie Ihren Java-Code jedoch 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 ist, die Sie erwarten.

Sie können das Problem immer noch nicht finden?

Es gibt viele Dinge zu überprüfen, und es ist leicht, etwas zu übersehen. Versuchen Sie, die -XdiagOption zur javaBefehlszeile hinzuzufügen (als erstes danach java). Es werden verschiedene Dinge über das Laden von Klassen ausgegeben, und dies kann Ihnen Hinweise darauf geben, was das eigentliche Problem ist.

Berücksichtigen Sie auch mögliche Probleme, die durch das Kopieren und Einfügen unsichtbarer oder Nicht-ASCII-Zeichen von Websites, Dokumenten usw. verursacht werden. Und denken Sie an "Homoglyphen", bei denen zwei Buchstaben oder Symbole gleich aussehen ... aber nicht.

Schließlich können Sie anscheinend auf dieses Problem stoßen, wenn Sie versuchen, von einer JAR-Datei mit falschen Signaturen in zu starten (META-INF/*.SF).


Alternative Syntaxen für java

Es gibt drei alternative Syntaxen zum Starten von Java-Programmen mit java command.

1) Die zum Starten einer "ausführbaren" JAR-Datei verwendete Syntax lautet wie folgt:

  java [ <options> ] -jar <jar-file-name> [<arg> ...]

z.B

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

Der Name der Einstiegspunktklasse (dh com.acme.example.ListUser) und der Klassenpfad werden im MANIFEST der JAR-Datei angegeben.

2) Die Syntax zum Starten einer Anwendung von einem Modul (Java 9 und höher) lautet wie folgt:

  java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]

Der Name der Einstiegspunktklasse wird entweder durch das Selbst definiert <module>oder durch das Optionale angegeben <mainclass>.

3) Ab Java 11 können Sie eine einzelne Quellcodedatei kompilieren, ausführen und mit der folgenden Syntax ausführen:

  java [ <options> ] <sourcefile> [<arg> ...]

Wo ist (normalerweise) eine Datei mit dem Suffix ".java".

Weitere Informationen finden Sie in der offiziellen Dokumentation zum javaBefehl für die von Ihnen verwendete Java-Version.


IDEs

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

Es ist jedoch weiterhin möglich, dass diese Ausnahme auftritt, wenn Sie Dinge hinter der Rückseite der IDE ausführen. Wenn Sie beispielsweise zuvor in Eclipse einen Application Launcher für Ihre Java-App eingerichtet und dann die JAR-Datei mit der Hauptklasse an eine andere Stelle im Dateisystem verschoben haben, ohne Eclipse mitzuteilen, würde Eclipse die JVM unbeabsichtigt starten mit einem falschen Klassenpfad.

Kurz gesagt, wenn dieses Problem in einer IDE auftritt, suchen Sie nach veralteten IDE-Status, fehlerhaften Projektreferenzen oder fehlerhaften Startkonfigurationen.

Es ist auch möglich, dass eine IDE einfach verwirrt wird. IDEs sind äußerst komplizierte Softwareteile, die viele interagierende Teile umfassen. Viele dieser Teile verwenden verschiedene Caching-Strategien, um die IDE als Ganzes reaktionsfähig zu machen. Diese können manchmal schief gehen, und ein mögliches Symptom sind Probleme beim Starten von Anwendungen. Wenn Sie den Verdacht haben, dass dies passieren könnte, sollten Sie andere Dinge ausprobieren, z. B. den Neustart Ihrer IDE, die Neuerstellung des Projekts usw.


Weitere Referenzen

Stephen C.
quelle
43
Ich hatte dieses Problem, als ich versuchte, eine Klasse mit einer Bibliothek eines Drittanbieters zu betreiben. Ich habe Java so aufgerufen : java -cp ../third-party-library.jar com.my.package.MyClass; Dies funktioniert nicht, stattdessen muss der lokale Ordner ebenfalls zum Klassenpfad hinzugefügt werden (getrennt durch :: java -cp ../third-party-library.jar:. com.my.package.MyClass, dann sollte es funktionieren
Lanoxx
23
Nach Jahren der Java-Programmierung gelang es mir immer noch, auf dieser Seite zu landen. Für mich war das Problem, dass die Klassenpfadsyntax vom Betriebssystem abhängig ist . Ich bin ein bisschen neu in der Programmierung unter Windows und hatte keine Ahnung.
Keyser
5
Zusätzliche Hinweise, Punkt 2 rette mich! Es ist traurig zu sehen, dass javanicht gesagt wird, dass keine importierte Klasse gefunden wird, sondern die Hauptklasse, die Sie ausführen möchten. Das ist irreführend, obwohl ich sicher bin, dass es dafür einen Grund gibt. Ich hatte den Fall, in javadem ich genau wusste, wo sich meine Klasse befindet, konnte jedoch keine der importierten Klassen finden. Anstatt das zu sagen, beschwerte es sich darüber, meine Hauptklasse nicht zu finden. Wirklich, nervig.
MSX
Ich hatte dieses Problem zweimal in Eclipse. Zum ersten Mal war die Signatur von main () falsch. Beim zweiten Mal habe ich eine .jar-Datei umbenannt, und obwohl ich die neue zum Erstellungspfad hinzugefügt habe, hat Eclipse die alte nicht gefunden, sodass das Projekt mit diesem Fehler nicht kompiliert wurde. Ich musste die JAR-Datei aus Projekt> Eigenschaften> Java-Erstellungspfad> Bibliotheken entfernen.
GregT
Ich bin es ein drittes Mal begegnet. Ich habe das Programm aus einer Windows 10-Batchdatei ausgeführt und den Namen .jar in eine Variable eingefügt (aufgerufen mit "-cp% jarname%; lib *"). Ich habe fälschlicherweise ein zusätzliches Leerzeichen am Ende des Jarnamens eingefügt, was den Fehler verursacht hat. Hattrick :)
GregT
239

Wenn Ihr Quellcode HelloWorld.java lautet, lautet Ihr kompilierter Code HelloWorld.class.

Sie erhalten diesen Fehler, wenn Sie ihn aufrufen mit:

java HelloWorld.class

Verwenden Sie stattdessen Folgendes:

java HelloWorld
Panoet
quelle
3
Das Problem ist, dass diese Lösung nur für Java-Klassen funktioniert, die im Standardpaket ohne JAR-Dateiabhängigkeiten deklariert sind. (Und selbst dann nicht immer.) Die meisten Java-Programme sind nicht so einfach.
Stephen C
1
Wie Stephen sagte, funktioniert dies nur mit "Standardpaket" - was bedeutet, dass keine Paketdeklaration oben in der Datei steht. Für einen kurzen Test eines Codes habe ich: javac TestCode.javagefolgt vonjava TestCode
Someone Somewhere
Das hat bei mir nicht funktioniert. Es heißt immer noch: "Die Hauptklasse HelloWorld konnte nicht gefunden oder geladen werden"
Jim
java -jar HelloWorld.jar ist auch eine Option
BMaximus
12
Ich musste tunjava -classpath . HelloWorld
Chris Prince
136

Wenn Ihre Klassen in Paketen sind, müssen Siecd in das Stammverzeichnis Ihres Projekts wechseln und den vollständig qualifizierten Namen der Klasse (packageName.MainClassName) verwenden.

Beispiel:

Meine Klassen sind hier:

D:\project\com\cse\

Der vollqualifizierte Name meiner Hauptklasse lautet:

com.cse.Main

Also gehe ich cdzurück zum Stammprojektverzeichnis:

D:\project

Geben Sie dann den folgenden javaBefehl ein:

java com.cse.Main

Diese Antwort dient dazu, neue Java-Programmierer vor der Frustration zu retten, die durch einen häufigen Fehler verursacht wurde. Ich empfehle Ihnen, die akzeptierte Antwort zu lesen, um mehr über den Java-Klassenpfad zu erfahren.

tharinduwijewardane
quelle
2
Diese Antwort macht eine ganze Reihe von Annahmen. Und es gibt andere Möglichkeiten, dies zu erreichen. Anstatt den obigen Ratschlägen blind zu folgen, würde ich empfehlen, dass sich die Leute die Zeit nehmen, die Links in meiner Antwort zu lesen, die erklären, wie der Java-Klassenpfad funktioniert. Es ist besser zu verstehen, was Sie tun ...
Stephen C
2
Diese Antwort macht die genauen Annahmen, die ich brauchte :) Ich befand mich im Verzeichnis der .class-Datei und java.exe funktionierte nicht. Nachdem ich oben eine CD erstellt und mit dem in der Befehlszeile enthaltenen Paketnamen ausgeführt hatte, funktionierte es.
Nick Constantine
61

Wenn Sie die Hauptklasse und die Hauptmethode in a definierenpackage , 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 ihn Main.Classin das paketähnliche Verzeichnis einfügen ./com/test/Main.Java. Und im Stammverzeichnis verwenden java com.test.Main.

M-Razavi
quelle
1
Siehe "Zusätzliche Hinweise Nr. 1" meiner Antwort. Zur besseren Erklärung dieses Problems.
Stephen C
14
@StephenC Ja, Ihre Antwort ist vollständiger (und natürlich +1), aber diese spezielle Antwort enthielt das Wort "Paket", wodurch ich schnell finden konnte, was ich brauchte. Und es hat funktioniert. Also +1 Razavi. StephenC, Ihnen fehlt das einfache Paketbeispiel, das ich brauchte, da ich neu in Java bin.
kmort
5
Das war genau mein Problem. Ich habe Tonnen von Java-Dokumenten durchgesehen und dieses konkrete Beispiel ist das, was ich brauchte
John
1
Ja, konkretes Beispiel ist schön, das hat perfekt funktioniert. Ich bin sicher, die Hauptantwort ist sehr gründlich, aber es war schwierig, den Baum für den Wald zu sehen. Schöne @Razavi
Pixel
1
Ich mag diese kürzere und nützliche Antwort anstatt die akzeptierte!
Spara
46

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

javac HelloWorld.java
java -cp . HelloWorld
Enamul Hassan
quelle
2
Dies ist keine gute Empfehlung. Sie sind davon abhängig, dass die Umgebungsvariable CLASSPATH nicht festgelegt ist oder einen Wert hat, der mit "." Konsistent ist. Ja, es funktioniert in vielen Fällen, in anderen jedoch nicht.
Stephen C
Na sicher javac -classpath . HelloWorld.javahätte es geklappt! Und das ist in Ihrem Fall eine bessere Lösung.
Stephen C
2
Wenn Sie als erste Zeile 'package com.some.address' haben, funktioniert dies nicht. Sie müssen 'Paketadresse' auskommentieren.
Joe
1
@ Joe - Dieser Hack (das Paket auskommentieren) wird (in einigen Fällen) funktionieren, aber es ist eine schlechte Idee. Eine bessere Idee ist es, zu lernen / zu verstehen, was das Problem verursacht hat, und die richtige Lösung zu implementieren.
Stephen C
36

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

  1. Einen neuen Ordner erstellen, C:\temp

  2. Erstellen Sie die Datei Temp.java C:\tempmit 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:\tempund schreiben Sie den folgenden Befehl, um die Temp-Klasse zu kompilieren:

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

    java -classpath C:\temp Temp Hello!
Celebes
quelle
3
In Ubuntu musste ich auch den Pfad angeben. Verstehe nicht, warum das aktuelle Arbeitsverzeichnis nicht standardmäßig verwendet werden kann. Ich bin überzeugt, dass Java von Tastaturherstellern gesponsert wird !!
gegangen
1
@gone - Der Grund, warum "." ist nicht in $ PATH standardmäßig ist, dass es eine Sicherheitsfalle ist. seas.upenn.edu/cets/answers/dot-path.html
Stephen C
Vielen Dank dafür ...... obwohl ich nicht sicher bin, warum Java den Klassenpfad selbst nach dem Festlegen in Umgebungsvariablen nicht herausfinden konnte.
akash89
@ akash89 - Die wahrscheinlichsten Gründe waren: 1) java$ CLASSPATH wurde nicht angezeigt (weil Sie -classpath oder -jar verwendet haben) oder 2) die Klassenpfadeinstellung wurde nicht in der Umgebung festgelegt, die im jeweiligen Kontext nicht wirksamjava war Lauf; zB weil Sie die Datei nicht "quelliert" haben, in der die setenv-Befehle in der rechten Shell hinzugefügt wurden.
Stephen C
Ich habe immer noch den Fehler: Hauptklasse Temp konnte nicht gefunden oder geladen werden, konnte jemand helfen!
Stern
27

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

  1. Hauptklasse konnte nicht gefunden werden
  2. Hauptklasse konnte nicht geladen werden (dieser Fall wird in der akzeptierten Antwort nicht vollständig besprochen)

Die Hauptklasse konnte nicht gefunden werden, wenn der vollständig qualifizierte Klassenname einen Tippfehler oder eine falsche Syntax enthält oder im angegebenen Klassenpfad nicht vorhanden ist .

Hauptklasse konnte nicht geladen werdenDie Hauptklasse wenn die Klasse nicht initiiert werden kann. In der Regel erweitert die Hauptklasse eine andere Klasse und diese Klasse ist im angegebenen Klassenpfad nicht vorhanden.

Zum Beispiel:

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

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

Xiao Peng - ZenUML.com
quelle
"Grundsätzlich" gibt es auch viele andere Kategorien. Und das fehlende Problem der Oberklasse ist ein sehr ungewöhnlicher Unterfall. (So ​​ungewöhnlich, dass ich es noch nie gesehen habe ... in Fragen, die auf dieser Seite gestellt wurden.)
Stephen C
Es gibt ZWEI, weil der Fehler lautet "Hauptklasse konnte nicht gefunden oder geladen werden". Wenn es andere Kategorien gibt, teilen Sie mir dies bitte mit. Ich habe es gesehen, also möchte ich es hier nur teilen, vielleicht wird es jemand anderes brauchen.
Xiao Peng - ZenUML.com
1
Ich hätte es zu etwas wie "Sie müssen alle Klassen einschließen, die erforderlich sind, um die Hauptklasse zu initiieren, um diesen bestimmten Fehler zu vermeiden" überarbeitet. Ich versuche nicht, dich zu überzeugen. Es ist nur ein Weg, den ich gerne sehen würde. Ich habe die Antwort hier nur für Leute hinterlassen, die es mögen, Dinge auf diese Weise zu lesen. Lassen Sie uns diese Diskussion nicht weiter ausdehnen :) Ich habe meine Aussage in "in der akzeptierten Antwort nicht vollständig besprochen" geändert und hoffe, dass Sie sich besser fühlen.
Xiao Peng - ZenUML.com
5
Diese Informationen sind von entscheidender Bedeutung und verdienen eine ausdrückliche Erwähnung (dies ist die einzige Antwort, die erwähnt wird extends). Ich habe gerade auf die harte Tour gelernt, dass Java nicht meldet, welche tatsächliche Klasse nicht gefunden wurde (im Gegensatz zu ) , wenn die Hauptklasse nicht geladen werden kann, weil sie eine andere erweitert, die nicht gefunden werden konnte . Also ja, es passiert und es ist eine haarsträubende Situation, wenn Sie das nicht wissen. NoClassDefFoundError
Hugues M.
1
Gibt es in dieser Situation eine Möglichkeit, genau zu bestimmen, welche Abhängigkeitsklasse nicht geladen werden kann?
Carlos A. Ibarra
16

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
Yamahar1sp
quelle
Ja. Dies liegt höchstwahrscheinlich daran, dass Sie Mainsich nicht in der JAR-Datei befinden. -cp lib.jar;bedeutet dasselbe wie -cp lib.jar;. dh das aktuelle Verzeichnis ist im Klassenpfad enthalten.
Stephen C
Schließlich wurde das Problem für Unix behoben. Danke (funktioniert mit :)
Vicky
16

Versuchen Sie -Xdiag .

Die Antwort von Steve C deckt die möglichen Fälle gut ab, aber manchmal ist es nicht so einfach festzustellen, ob die Klasse nicht gefunden oder geladen werden konnte. Verwenden Sie java -Xdiag(seit JDK 7). Dies druckt eine schöne Stapelverfolgung aus, die einen Hinweis darauf gibt, was die Could not find or load main classNachrichtennachricht bedeutet.

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

jan.supol
quelle
16

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

Bei JDK 8 kommt es häufig vor, dass sich die Klassendatei im selben Ordner befindet, der javaBefehl jedoch einen Klassenpfad erwartet. Aus diesem Grund wird -cp .der aktuelle Ordner als Referenz für den Klassenpfad verwendet.

shaILU
quelle
Dies funktioniert nur in einfachen Fällen. Kompliziertere Fälle erfordern einen komplizierteren Klassenpfad.
Stephen C
Und für >> wirklich << einfache Fälle -cp .ist dies nicht erforderlich, denn wenn dies nicht festgelegt $CLASSPATHist, .ist dies der Standardklassenpfad.
Stephen C
Nein Stephen, oft funktioniert der Windows-Standardklassenpfad nicht. Ich habe es auf drei verschiedenen Maschinen ausprobiert, das können Sie auch ausprobieren.
ShaILU
Dies liegt wahrscheinlich daran, dass Sie die Umgebungsvariable% CLASSPATH% tatsächlich irgendwo festgelegt haben. Wenn Sie dies tun, verwenden Sie nicht den Standardklassenpfad. (Was gibt die echo %CLASSPATH%Ausgabe aus?) Und nein, ich kann nicht überprüfen, weil ich keinen Windows-PC habe.
Stephen C
2
Dies funktionierte für mich, als ich versuchte, ein einfaches Programm über die Befehlszeile
auszuführen
15

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 Bibliothek, auf die verwiesen wurde und die mir Folgendes gab:

Hauptklasse xxx Linux konnte nicht gefunden oder geladen werden

Ich habe gerade diese Referenz gelöscht, sie erneut hinzugefügt und sie hat wieder einwandfrei funktioniert.

Eduardo Dennis
quelle
1
Es klingt so, als ob das Problem darin bestand, dass Sie aufgrund einer fehlerhaften "Referenz" in Ihrem Projekt in Ihrer IDE einen falschen Klassenpfad hatten. Ich werde meine Antwort aktualisieren, um diesen Fall abzudecken.
Stephen C
@StephenC und EduardoDennis, es fehlte auch hier ein Glas, das eine Schnittstelle enthielt, von der die Hauptklasse abhängig war, um instanziiert zu werden. Die Fehlermeldung ist also zu breit. Ich sollte sagen "konnte nicht finden", wenn die Klassendatei nicht gefunden wird, und "konnte nicht geladen werden (fehlende Abhängigkeiten)", wenn etwas anderes fehlt, aber nicht die Datei selbst. Daher ist die zu breite Fehlermeldung irreführend, wenn Sie sich nur konzentrieren auf dem "find" Teil davon :(
Aquarius Power
@AquariusPower - Es sollte eine zusätzliche Stapelverfolgung "verursacht durch" für die Ausnahme "Ursache" geben, bei der die Klasse wht fehlte. Wenn Sie den Java-Entwicklern vorschlagen möchten, dass sie eine Fehlermeldung ändern, die besagt, dass dies seit mehr als 20 Jahren der Fall ist ... fühlen Sie sich frei. (Ich denke, dass die Fehlermeldung korrekt ist. Das Problem war, dass >> Sie << auf die falsche Klausel eingegrenzt haben.)
Stephen C
@StephenC Ich meinte, sie haben sicherlich Zugriff auf die Informationen, ob die Hauptklassendatei verfügbar ist oder nicht. Warum also nicht eine bessere Fehlermeldung anzeigen, die besagt, dass eine solche Datei fehlt? Auf der anderen Seite könnten sie auch sagen "Die Datei wurde gefunden, konnte aber nicht geladen werden". Zu diesem Zeitpunkt würden wir uns umgehend auf Abhängigkeiten konzentrieren, anstatt einen halben Tag zu verlieren, um Dinge zu erforschen und zu testen, um sie zu verstehen. Nur das meinte ich :). Sie können es über 20 Jahre lang in begrenztem Umfang tun, aber sie können es verbessern, und wir sind hier, um zu gewähren, dass dies durch unsere Kritik und Beschwerden geschehen wird! : D
Wassermann Power
Bitte verstehe, was >> ich << gemeint habe. Sich darüber in einem obskuren Kommentar zu 3-jährigen Fragen und Antworten zu beschweren, wird nichts bewirken. Die Leute, die möglicherweise auf Ihre Beschwerden reagieren, werden es nicht bemerken. Wenn Sie etwas Konstruktives tun möchten, senden Sie einen Patch. (Ich bewerte Ihre Chancen nicht, aber sie werden größer sein, als wenn Sie nur darüber nachdenken.)
Stephen C
10

In diesem Fall haben Sie:

Hauptklasse ? Klassenpfad konnte nicht gefunden oder geladen werden

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

Nathan Williams
quelle
2
Beeindruckend! Das ist eine total bizarre Sache! (Aber es dient Ihnen als Recht, Notepad anstelle eines echten Texteditors zu verwenden :-))
Stephen C
10

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 (ich konnte die Hauptklasse nicht finden oder laden 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

Schließlich habe ich nur das Zeichen ':' am Ende des Klassenpfads hinzugefügt und das Problem wurde gelöst:

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
Omid Mohebbi
quelle
7

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

Wir müssen dem Interpret den Klassennamen mit der Hauptmethode geben.

KawaiKx
quelle
Ja. Siehe mein Beispiel Nr. 2 der falschen Möglichkeiten, den Klassennamen anzugeben !!
Stephen C
7

Dies kann Ihnen helfen, wenn Ihr Fall speziell meinem entspricht: Als Anfänger bin ich auch auf dieses Problem gestoßen, als ich versucht habe, ein Java-Programm 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 .javaden Befehl entfernte und neu schrieb java HelloWorld, lief das Programm perfekt. :) :)

Ramesh Pareek
quelle
2
Dies liegt daran, dass Sie die kompilierte Version Ihrer .java ausführen. Es führt tatsächlich die .class-Datei aus
Jason V
Für die Aufzeichnung ist dies der gleiche wie Grund # 1, Beispiel # 5 in meiner Antwort ...
Stephen C
6

Alle Antworten hier richten sich anscheinend an Windows-Benutzer. Für Mac ist das Klassenpfadtrennzeichen :nicht ;. Als Fehler beim Einstellen des Klassenpfads mit; nicht ausgelöst wird, kann es schwierig sein, dies zu erkennen, wenn Sie von Windows auf Mac kommen.

Hier ist der entsprechende Mac-Befehl:

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

Wo in diesem Beispiel das Paket ist com.testund ein libOrdner auch im Klassenpfad enthalten sein soll.

blauer Himmel
quelle
2
Unter Linux genauso wie unter Mac.
Alex78191
Warum /*ist notwendig?
Alex78191
Es ist eine Wildcard-Syntax. (Es ist nicht obligatorisch. Sie können die JARs explizit auflisten, wenn Sie möchten.)
Stephen C
6

Geben Sie hier die Bildbeschreibung ein

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

Dateiname: Main.class

Vollqualifizierter Klassenname: com.company.Main

Befehlszeilenbefehl:

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

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

Entwickler747
quelle
6

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

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

anstatt:

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

Ich dachte, die Bedeutung von voll qualifiziert bedeutet, den vollständigen Pfadnamen anstelle des vollständigen Paketnamens einzuschließen.

Mathewbruens
quelle
Ich habe meine Antwort aktualisiert, um diese Verwirrung zu beseitigen.
Stephen C
2
Beides ist nicht richtig. Die Klasse muss gegebenenfalls als utilities.myapp.Cooloder wie auch immer der Paketname angegeben werden.
Marquis von Lorne
5

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 (Ordnername)" in das gespeicherte Laufwerk ein und kompilieren Sie es. Wenn mein Programm beispielsweise auf dem Laufwerk D gespeichert ist, geben Sie "D:" ein, drücken Sie die Eingabetaste und geben Sie "cd (Ordnername)" ein.

arun
quelle
4
Das hilft nicht. Diese Frage bezieht sich auf Java-Programme, nicht auf gewöhnliche ausführbare Dateien. Java verwendet PATH nicht, um etwas zu finden, und wenn "cd" hilft, dann eher durch Glück als durch Urteilsvermögen.
Stephen C
if "cd" helps then it by luck rather than by judgement. Dies ist falsch (glaube ich), da Java standardmäßig das aktuelle Verzeichnis .als Teil des Klassenpfads verwendet.
GKFX
2
@ GKFX - Das meine ich. Wenn Sie nicht wissen, dass Sie den Standardklassenpfad (oder einen Klassenpfad mit ".") Verwenden, hat "cd" keine Auswirkung. Diese Lösung funktioniert mehr durch Glück (dh Erraten / Hoffen, dass sich "." Auf dem Klassenpfad befindet) als durch Urteilsvermögen (dh Überprüfen, ob sich "." Auf dem Klassenpfad befindet). Außerdem sind Sie bezüglich der Standardeinstellung falsch. Java verwendet "." Standardmäßig als Klassenpfad, standardmäßig nicht als Teil des Klassenpfads.
Stephen C
5

Was das Problem in meinem Fall behoben hat, war:

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

Öffnen Sie die ClasspathRegisterkarte, klicken Sie auf die Advanced...Schaltfläche und fügen Sie den binOrdner Ihres Projekts hinzu.

Syntagma
quelle
5

Wenn Sie die JAR-Datei mit Maven erstellen, 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>
Junchen Liu
quelle
4

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

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

Ich habe dies herausgefunden, als ich ein .jarin NetBeans erstellt und versucht habe, es in der Befehlszeile auszuführen. Es lief in NetBeans, aber nicht in der Kommandozeile.

GuiRitter
quelle
4

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

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

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

Nenad Bulatovic
quelle
1
Dieser Rat kann helfen oder nicht. Es ist hilfreich, wenn der Klassenbaum die Klassen im aktuellen Verzeichnis enthält. Es wird nicht, wenn sie nicht sind. Ich würde das eigentlich nicht tun. Stattdessen würde ich ein einzeiliges Wrapper-Skript erstellen, das funktioniert, unabhängig davon, ob sich der Benutzer im "richtigen" Verzeichnis befindet oder nicht.
Stephen C
4

Sie müssen dies wirklich aus dem srcOrdner tun . Dort geben Sie folgende Befehlszeile ein:

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

Angenommen, Ihre Klasse heißt CommandLine.classund 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 cdin den Ordner src gehen und der Befehl, den Sie ausführen müssen, würde folgendermaßen aussehen:

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

Und die Ausgabe in der Kommandozeile wäre:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
Mike. D.
quelle
2
Eine Klasse kann nicht "CommandLine.class" genannt werden. Das wäre ein Java-Syntaxfehler. (Sie meinen damit, dass die Datei mit der kompilierten Klasse "CommandLine.class" heißt ...). Das andere Problem ist, dass Ihre Anweisung "CD ins Quellverzeichnis" nur funktioniert, wenn Sie den Code >> in << den Quellverzeichnisbaum kompiliert haben. Wenn Ihre Kompilierung ein "-cp" -Argument verwendet hat, benötigen Sie beim Ausführen ein Äquivalent.
Stephen C
In meinem Projekt habe ich den Ordner src und den Ordner bin im Stammverzeichnis. Ich musste cdin srcund dann den Befehl ausführen , java ../bin com.blah.blah.MyClassdie für mich gearbeitet. Also danke für den Tipp!
Tamj0rd2
3

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

Error: main class not found or loaded

Dies geschieht, 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. Wenn sich eine Klasse nicht im Klassenpfad befindet, wird der ausgelöste Fehler normalerweise als solche 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/

Anandaraja Ravi
quelle
1
Hast du die akzeptierte Antwort gelesen? Fügt Ihre Antwort etwas Neues hinzu?
Stephen C
1
@StephenC Ich habe versucht, einen Grund in Ihrer Liste zu finden, indem ich mir die Kategorien "Grund" und ihre Punkte angesehen habe. Ich konnte den passenden Punkt in "Grund Nr. 1" und "Grund Nr. 2" nicht finden und sah meinem Fall nicht nahe (weil ich sicher war, dass es kein Problem mit dem Klassenpfad selbst gibt). Ich habe den Grund durch Ausführen von Experimenten gefunden und war überrascht, dass in meinem Fall der Fehler "Hauptklasse nicht gefunden" angezeigt wurde, weil sich die Implementierungsschnittstelle nicht im Klassenpfad befand. Sicher können Sie sagen "Sie sollten alles lesen, was in dem Beitrag beschrieben ist", aber es scheint mir, dass Ihre Ursachenliste verbessert werden kann.
Gummis
3

Wenn Sie javadie -cpOption mit der in Windows PowerShell angegebenen Option ausführen, wird möglicherweise ein Fehler angezeigt, der ungefähr so ​​aussieht:

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

Damit PowerShell den Befehl akzeptiert, müssen die Argumente der -cpOption 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.

Chezzwizz
quelle
3

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

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

Kompilieren:

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

Lauf:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • Bitte beachten Sie den Doppelpunkt (Unix) / Komma (Windows), nachdem alle JAR-Abhängigkeitsdateien beendet sind
  • Beobachten Sie am Ende den Namen der Hauptklasse ohne Erweiterung (keine .class oder .java).
khichar.anil
quelle
Dies alles setzt voraus, dass 1) JavaMongoDBConnectionkein Paket vorhanden ist und 2) Sie das Verzeichnis nicht wechseln. Es ist gelinde gesagt zerbrechlich. Und wenn die Probleme nicht erklärt werden, können Neulinge diesen Ansatz in Situationen ausprobieren, in denen er nicht funktioniert . Kurz gesagt, es fördert "Voodoo-Programmiertechniken": en.wikipedia.org/wiki/Voodoo_programming
Stephen C
3

In Ordnung, es gibt bereits viele Antworten, aber niemand erwähnte den Fall, in dem Dateiberechtigungen der Schuldige sein können.

Während der Ausführung hat ein Benutzer möglicherweise keinen Zugriff auf die JAR-Datei oder eines der Verzeichnisse des Pfads. Betrachten Sie zum Beispiel:

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

Benutzer1, dem die JAR-Datei gehört, kann Folgendes tun:

# 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 laufende Benutzer (Benutzer2) keinen Zugriff auf dir1, dir2 oder javalibs oder dir3 hat. Es kann jemanden verrückt machen, wenn Benutzer1 die Dateien sehen und darauf zugreifen kann, aber der Fehler tritt immer noch für Benutzer2 auf.

Biocyberman
quelle
2

Ich habe diesen Fehler erhalten, nachdem ich dies getan habe. mvn eclipse:eclipse Dies hat meine .classpathDatei ein wenig durcheinander gebracht .

Musste die Zeilen .classpathvon ä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" />
Jaanus
quelle
2

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

  • Erstens bin ich auf verschiedene mainMethoden in verschiedenen Klassen meines Projekts gestoßen. Also hatte ich die mainMethode aus nachfolgenden Klassen gelöscht .
  • Zweitens habe ich folgende Lösung versucht:
    1. Klicken Sie mit der rechten Maustaste auf mein Hauptprojektverzeichnis.
    2. Gehen Sie zur Quelle, bereinigen Sie und bleiben Sie bei den Standardeinstellungen und bei 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.
Anus Kaleem
quelle
1
Das Löschen von mainMethoden behebt das Problem nicht. An einer Anwendung mit mehreren Einstiegspunkten ist technisch nichts auszusetzen.
Stephen C