377 Stimmen

Fehler: Die 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 gemeinsamen Objekt für Vensim, einem Simulationsmodellierungspaket, zu verbinden.

Der folgende Code lässt sich ohne Fehler kompilieren:

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, das Folgende auszuführen:

java -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars

Ich erhalte die folgende Fehlermeldung: "Fehler: Die 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, wo das Problem liegt - kann mir bitte jemand helfen? Danke!

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

}

299voto

Saket Punkte 44477

Sie müssen sicherstellen, dass Sie den Standort Ihrer .class Datei in Ihren Klassenpfad. Wenn sie sich also im aktuellen Ordner befindet, fügen Sie . zu Ihrem Klassenpfad hinzufügen. Beachten Sie, dass das Windows-Klassenpfad-Trennzeichen ein Semikolon ist, d.h. ein ; .

150voto

aliteralmind Punkte 19059

Wenn die Klasse in einem Paket ist

package thepackagename;

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

Dann rufen Sie an:

java -classpath . TheClassName

führt zu Error: Could not find or load main class TheClassName . Der Grund dafür ist, dass er mit seinem vollqualifizierten Namen aufgerufen werden muss:

java -classpath . thepackagename.TheClassName

Und dies thepackagename Verzeichnis muss im Klassenpfad vorhanden sein. In diesem Beispiel, . , d.h. das aktuelle Verzeichnis, ist die Gesamtheit des Klassenpfads. Daher muss dieses spezielle Beispiel aus dem Verzeichnis aufgerufen werden, in dem thepackagename existiert.

Um das klarzustellen, der Name dieser Klasse ist nicht TheClassName , Es ist thepackagename.TheClassName . Der Versuch der Ausführung TheClassName funktioniert nicht, weil keine Klasse mit diesem Namen existiert . Jedenfalls nicht auf dem aktuellen Klassenpfad.

Schließlich ist zu beachten, dass die kompilierten ( .class)-Version ausgeführt wird, nicht der Quellcode ( .java) Version. Daher "CLASSPATH".

67voto

Sudhakar Pabbati Punkte 659

Sie können diese beiden ausprobieren, wenn Sie die Fehlermeldung erhalten: 'could not find or load main class'.

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

  1. java -cp d:\sample HelloWorld
  2. java -cp . HelloWorld

39voto

Rafael Cordones Punkte 813

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

java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars

36voto

Muhammad Soliman Punkte 18437

Sie müssen den Klassenpfad in Ihre javac- und java-Befehle aufnehmen

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

Angenommen, Sie haben Folgendes

Paket mit dem Namen: com.test Klassenname: Hallo (nach 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
  • Unter Windows wird dasselbe auch funktionieren, ich habe bereits versucht

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X