Error: no se pudo encontrar ni cargar la clase principal [duplicado]

Resuelto Dave asked hace 13 años • 22 respuestas

Tengo problemas para compilar y ejecutar mi código Java, cuyo objetivo es permitirme conectar Java con un objeto compartido para Vensim, un paquete de modelado de simulación.

El siguiente código se compila sin errores:

javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java     VensimHelper.java VensimException.java VensimContextRepository.java

Sin embargo, cuando intento ejecutar lo siguiente:

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

Recibo el siguiente error: "Error: no se pudo encontrar ni cargar la clase principal SpatialModel". Mi código SpatialModel.java contiene un método "principal" (a continuación), por lo que no estoy seguro de cuál es el problema. ¿Alguien puede ayudarme? Gracias.

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

}
Dave avatar Sep 20 '11 20:09 Dave
Aceptado

Debe asegurarse de agregar la ubicación de su .classarchivo a su classpath. Entonces, si está en la carpeta actual, agréguelo .a su classpath. Tenga en cuenta que el separador de classpath de Windows es un punto y coma, es decir, un ;.

Saket avatar Sep 20 '2011 13:09 Saket

Si la clase está en un paquete

package thepackagename;

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

Luego llamando:

java -classpath . TheClassName

da como resultado Error: Could not find or load main class TheClassName. Esto se debe a que se debe llamar con su nombre completo:

java -classpath . thepackagename.TheClassName

Y este thepackagenamedirectorio debe existir en el classpath. En este ejemplo, .es decir, el directorio actual, es la totalidad del classpath. Por lo tanto, este ejemplo en particular debe llamarse desde el directorio en el que thepackagenameexiste.

Para ser claros, el nombre de esta clase no es TheClassName, es thepackagename.TheClassName. Intentar ejecutar TheClassNameno funciona porque no existe ninguna clase con ese nombre . De todos modos, no en el classpath actual.

Finalmente, tenga en cuenta que se ejecuta la versión compilada ( .class), no la versión del código fuente (.java). De ahí "CLASSPATH".

aliteralmind avatar Mar 29 '2015 16:03 aliteralmind

Puede probar estos dos cuando reciba el error: "no se pudo encontrar ni cargar la clase principal"

Si su archivo de clase está guardado en el siguiente directorio con HelloWorldel nombre del programa d:\sample

  1. java -cp d:\sample HelloWorld
  2. java -cp . HelloWorld
Sudhakar Pabbati avatar Jan 21 '2012 17:01 Sudhakar Pabbati

Creo que necesitas agregar el directorio actual al classpath de Java.

java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
Rafael Cordones avatar Sep 20 '2011 13:09 Rafael Cordones

Tienes que incluir classpath en tus comandos javac y java.

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

supongamos que tienes lo siguiente

Nombre del paquete: com.test Nombre de la clase: Hola (que tiene el archivo principal) se encuentra dentro de "src/com/test/Hello.java"

desde el directorio externo:

$ cd src
$ javac -cp . com/test/*.java
$ java -cp . com/test/Hello
  • En Windows también funcionará lo mismo, ya lo intenté.
Muhammad Soliman avatar Nov 03 '2014 13:11 Muhammad Soliman