Error: no se pudo encontrar ni cargar la clase principal [duplicado]
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));
}
}
Debe asegurarse de agregar la ubicación de su .class
archivo 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 ;
.
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 thepackagename
directorio 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 thepackagename
existe.
Para ser claros, el nombre de esta clase no es TheClassName
, es thepackagename.TheClassName
. Intentar ejecutar TheClassName
no 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".
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 HelloWorld
el nombre del programa
d:\sample
java -cp d:\sample HelloWorld
java -cp . HelloWorld
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
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é.