wake-up-neo.net

Fehler: Hauptklasse konnte nicht gefunden oder geladen werden

Ich habe Probleme beim Kompilieren und Ausführen meines Java Codes, der es mir ermöglichen soll, Java mit einem gemeinsam genutzten Objekt für Vensim, einem Simulationsmodellierungspaket, zu verbinden.

Der folgende Code wird ohne Fehler kompiliert:

javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java     VensimHelper.Java VensimException.Java VensimContextRepository.Java

Wenn ich jedoch versuche, Folgendes auszuführen:

Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars

Ich erhalte die folgende Fehlermeldung: "Fehler: Hauptklasse SpatialModel konnte nicht gefunden oder geladen werden". Mein SpatialModel.Java-Code enthält eine 'main'-Methode (siehe unten), daher bin ich mir nicht sicher, was das Problem ist. Kann mir jemand helfen? Vielen Dank.

import Java.io.File;
import Java.text.NumberFormat;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;

import org.Apache.log4j.Logger;

public class SpatialModel {

    private VensimHelper vh;

    public static final String DLL_LIBNAME_PARAM = "vensim_lib_nam";

    public static final String MODEL_PATH_PARAM = "vensim_model_path";

    private final static int VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT = 10;

    public SpatialModel() throws SpatialException {

        String libName = System.getProperty(DLL_LIBNAME_PARAM);
        String modelPath = System.getProperty(MODEL_PATH_PARAM);        

        if(libName == null || libName.trim().equals("")) {
            log.error("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
            throw new SpatialException("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
        }

        if(modelPath == null || modelPath.trim().equals("")) {
            log.error("Model path has to set with -D" + MODEL_PATH_PARAM);
            throw new SpatialException("Model path ahs to be set with -D" + MODEL_PATH_PARAM);
        }

        for (int i = 0; i < VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT && vh == null; i++) {
            try {
                log.info("creating new vensim helper\n\tdll lib: " + libName + "\n\tmodel path: " + modelPath);
                vh = new VensimHelper(libName, modelPath);
            } catch (Throwable e) {
                log.error("An exception was thrown when initializing Vensim, try: " + i, e);
            }
        }
        if (vh == null) {
            throw new SpatialException("Can't initialize Vensim");
        }

    }

    public static void main(String[] args) throws VensimException {

        long before = System.currentTimeMillis();   
        String libName = System.getProperty(DLL_LIBNAME_PARAM);
        String modelPath = System.getProperty(MODEL_PATH_PARAM);

        if (libName == null) {
            libName = "libvensim";
        }
        if(modelPath == null) {
            modelPath = "~/BassModel.vmf";
        }

        System.setProperty(DLL_LIBNAME_PARAM, libName);
        System.setProperty(MODEL_PATH_PARAM, modelPath);

        if (args.length > 0 && args[0].equals("info")) {
            System.out.println(new VensimHelper(libName, modelPath).getVensimInfo());
        } else if (args.length > 0 && args[0].equals("vars")) {
            VensimHelper helper = new VensimHelper(libName, modelPath);
            String[] vars = helper.getVariables();
            for (String var : vars) {
                System.out.println(helper.getVariableInfo(var));
            }
        } else {

            File f = new File(".");
            System.out.println(f.getAbsolutePath());

            SpatialModel sm = new SpatialModel();
        }

        System.out.println("Execution time: " + (System.currentTimeMillis() - before));
    }

}
340
Dave

Sie müssen sicherstellen, dass Sie den Speicherort Ihrer .class -Datei zu Ihrem Klassenpfad hinzufügen. Wenn es sich also im aktuellen Ordner befindet, fügen Sie Ihrem Klassenpfad . hinzu. Beachten Sie, dass das Windows-Klassenpfadtrennzeichen ein Semikolon ist, d. H. Ein ;.

261
Saket

Wenn die Klasse in einem Paket enthalten ist

package thepackagename;

public class TheClassName {
  public static final void main(String[] cmd_lineParams)  {
     System.out.println("Hello World!");
  } 
}

Dann anrufen:

Java -classpath . TheClassName

führt zu Error: Could not find or load main class TheClassName. Dies liegt daran, dass es mit seinem vollständig qualifizierten Namen aufgerufen werden muss:

Java -classpath . thepackagename.TheClassName

Und dieses thepackagename -Verzeichnis muss im Klassenpfad vorhanden sein. In diesem Beispiel ist ., dh das aktuelle Verzeichnis, der gesamte Klassenpfad. Daher muss dieses spezielle Beispiel aus dem Verzeichnis aufgerufen werden, in dem thepackagename vorhanden ist.

Um klar zu sein, der Name dieser Klasse ist nicht TheClassName, sondern thepackagename.TheClassName. Der Versuch, TheClassName auszuführen, funktioniert nicht, weil keine Klasse mit diesem Namen existiert. Auf dem aktuellen Klassenpfad sowieso nicht.

Beachten Sie schließlich, dass die kompilierte Version (. Class)) ausgeführt wird, nicht die Quellcode-Version (. Java. Daher "KLASSENPFAD".

131
aliteralmind

Sie können diese beiden versuchen, wenn der Fehler "Hauptklasse konnte nicht gefunden oder geladen werden" angezeigt wird.

Wenn Ihre Klassendatei in folgendem Verzeichnis mit HelloWorld Programmname d:\sample gespeichert ist

  1. Java -cp d:\sample HelloWorld
  2. Java -cp . HelloWorld
58

Ich glaube, Sie müssen das aktuelle Verzeichnis zum Klassenpfad Java hinzufügen

Java -cp .:./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
36
Rafael Cordones

Sie müssen den Befehl classpath in den Befehl javac und Java einfügen

javac -cp . PackageName/*.Java
java -cp . PackageName/ClassName_Having_main

angenommen, Sie haben Folgendes

Paket mit dem Namen: com.test Klassenname: Die Hello (Having main) -Datei befindet sich in "src/com/test/Hello.Java".

von außerhalb des Verzeichnisses:

$ cd src
$ javac -cp . com/test/*.Java
$ Java -cp . com/test/Hello
  • In Windows wird das gleiche auch funktionieren, ich habe es bereits versucht
30

Wenn Sie in Eclipse arbeiten, bereinigen Sie einfach das Projekt (project\clean..clean all projects).

26
cane

Sie müssen den Klassenpfad festlegen, wenn Sie den Fehler erhalten:

Hauptklasse XYZ konnte nicht gefunden oder geladen werden

Zum Beispiel:

E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.Java
E:\>Java XYZ
17
user2318595

Ich habe diesen Fehler bekommen, weil ich versucht habe zu rennen

javac HelloWorld.Java && Java HelloWorld.class

wann hätte ich .class entfernen sollen:

javac HelloWorld.Java && Java HelloWorld
16
Lri

Überprüfen Sie Ihr BuildPath. Möglicherweise verweisen Sie auf eine Bibliothek, die nicht mehr vorhanden ist.

9
Samsky

Wenn Sie versuchen, eine Java -Anwendung auszuführen, für die JDK 1.6 erforderlich ist, und Sie versuchen, sie unter JDK 1.4 auszuführen, wird dieser Fehler angezeigt. Im Allgemeinen kann der Versuch, eine Java -Anwendung auf einer alten JRE auszuführen, fehlschlagen. Versuchen Sie, neues JRE/JDK zu installieren.

7
Shaddu

Ich weiß, dass diese Frage mit linux getaggt wurde, aber unter Windows müssen Sie Ihre cp-Argumente möglicherweise durch einen ; anstelle eines : trennen.

Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar;./vensim.jar SpatialModel vars

http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

7
Snekse

Wenn diese Fehlermeldung angezeigt wird und Sie verwenden Maven, um Ihre Jars zu erstellen, besteht eine gute Chance, dass Sie Ihre Klassen Java in src/main/Java/ einfach nicht haben.

In meinem Fall habe ich mein Projekt in Eclipse erstellt. Der Standardwert ist src (anstelle von src/main/Java/).

So kam ich zu etwas wie mypackage.morepackage.myclass und einer Verzeichnisstruktur, die wie src/mypackage/morepackage/myclass aussieht, was von Natur aus nichts auszusetzen hat. Wenn Sie jedoch mvn clean install ausführen, wird nach src/main/Java/mypackage/morepackage/myclass gesucht. Es wird die Klasse nicht finden, aber es wird auch kein Fehler auftreten. Es wird also erfolgreich erstellt, und wenn Sie Ihr ausgegebenes Jar ausführen, ist das Ergebnis:

Error: Could not find or load main class mypackage.morepackage.myclass

Weil es Ihre Klasse einfach nie in das verpackte Glas eingeschlossen hat.

6
Mike S

Java -verbose:class HelloWorld hilft Ihnen möglicherweise zu verstehen, welche Klassen geladen werden.

Denken Sie auch daran, wie bereits erwähnt, den vollständigen qualifizierten Namen (d. H. Include-Paket) anzugeben.

5
Jose Alban

Projekt> Bereinigen Sie und stellen Sie dann sicher, dass BuildPath> Libraries die richtige Bibliothek enthält.

5
Giri

Das Problem liegt nicht in Ihrer Hauptfunktion. Check out für

javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java     VensimHelper.Java VensimException.Java VensimContextRepository.Java

ausgeben und ausführen.

5
ymutlu

Wenn Sie Eclipse verwenden ... Ich habe meine Hauptklassendatei umbenannt und diesen Fehler erhalten. Ich ging zum "Ausführen als" -Konfigurator und hatte unter dem Klassenpfad für dieses Projekt beide Dateien im Klassenpfad aufgelistet. Ich habe die alte Klasse, die ich umbenannt habe, entfernt und die Klasse mit dem neuen Namen verlassen. Sie wurde kompiliert und lief einwandfrei.

4
Argyle Ghost

Wenn so einfach, wie viele Leute denken, mich eingeschlossen :)

cd to Project Folder/src/package dort sollten Sie yourClass.Java sehen und dann javac yourClass.Java ausführen, wodurch yourClass.class erstellt wird und cd aus src und in den Ordner build können Sie Java package.youClass ausführen

Ich verwende das Terminal auf einem Mac, oder Sie können dieselbe Aufgabe mit der Eingabeaufforderung unter Windows ausführen

4
don

Dieses Problem trat bei mir auf, als ich ein vorhandenes Projekt in Eclipse importierte. Was passiert, ist, dass alle Dateien nicht in das Paket, sondern außerhalb des Pakets kopiert werden. Als ich also versuchte, Konfigurationen auszuführen> auszuführen, konnte die Hauptmethode nicht gefunden werden, da sie nicht im Paket enthalten war. Ich habe nur die Dateien in das Paket kopiert und Eclipse konnte dann die Hauptmethode erkennen. Stellen Sie also letztendlich sicher, dass Eclipse Ihre Hauptmethode findet, indem Sie sicherstellen, dass sich Ihre Java -Dateien im richtigen Paket befinden.

4
JohnMerlino

Ich habe Java 1.8 verwendet, und dieser Fehler trat plötzlich auf, als ich in NetBeans auf "Build and Clean" drückte. Ich wechselte für einen kurzen Moment wieder auf 1.7, klickte auf OK, öffnete die Eigenschaften erneut und wechselte wieder auf 1.8, und alles funktionierte perfekt.

Ich hoffe, ich kann jemandem dabei helfen, da diese Fehler sehr zeitaufwändig sein können.

4
Maxim Geerinck

Ich habe ein ähnliches Problem in Windows, es hängt mit dem Klassenpfad zusammen. Navigieren Sie in der Befehlszeile zu dem Verzeichnis, in dem sich Ihre Java -Datei (* .Java und * .class) befindet, und wiederholen Sie den Vorgang mit Ihren Befehlen.

1
edwindh

Ich benutze Anypoint Studio (eine Eclipse-basierte IDE). In meinem Fall hat alles gut funktioniert, bis ich herausfand, dass beim Ausführen des Codes Java etwas völlig anderes ausgeführt wird. Dann habe ich die .class-Dateien gelöscht. Nach diesem Punkt erhielt ich die Fehlermeldung aus dem Titel dieser Frage. Das Bereinigen des Projekts löste das Problem nicht.

Nach dem Neustart von IDE hat alles wieder gut funktioniert.

1
Zsolti

Dies löste das Problem für mich heute:

cd /path/to/project
cd build
rm -r classes

Bereinigen und erstellen Sie es und führen Sie die einzelnen Dateien aus, die Sie benötigen.

1
Luc