Вопрос-ответ

Error: Could not find or load main class [duplicate]

Ошибка: не удалось найти или загрузить основной класс [дубликат]

У меня возникли проблемы с компиляцией и запуском моего Java-кода, предназначенного для того, чтобы позволить мне взаимодействовать Java с общим объектом для Vensim, пакета имитационного моделирования.

Следующий код компилируется без ошибок:

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

Однако, когда я пытаюсь запустить следующее:

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

Я получаю следующую ошибку: "Ошибка: не удалось найти или загрузить основной класс SpatialModel
". Мой SpatialModel.java код действительно содержит метод 'main' (ниже), поэтому я не уверен, в чем проблема - кто-нибудь, пожалуйста, может мне помочь? Спасибо.

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

}
Переведено автоматически
Ответ 1

Вы должны убедиться, что вы добавили местоположение вашего .class файла в свой classpath. Итак, если он находится в текущей папке, добавьте . в свой classpath. Обратите внимание, что разделителем пути к классу Windows является точка с запятой, т.е. ;.

Ответ 2

Если класс находится в пакете

package thepackagename;

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

Затем вызывается:

java -classpath . TheClassName

приводит к Error: Could not find or load main class TheClassName. Это связано с тем, что он должен вызываться с полным именем:

java -classpath . thepackagename.TheClassName

И этот thepackagename каталог должен существовать в пути к классу. В этом примере ., означающий текущий каталог, представляет собой полный путь к классу. Следовательно, этот конкретный пример должен быть вызван из каталога, в котором thepackagename существует.

Чтобы было понятно, имени этого класса нет TheClassName, это thepackagename.TheClassName. Попытка выполнить TheClassName не работает, потому что не существует класса с таким именем. Во всяком случае, не в текущем пути к классу.

Наконец, обратите внимание, что выполняется скомпилированная версия (.class), а не версия исходного кода (.java). Отсюда “ПУТЬ к КЛАССУ”.

Ответ 3

Вы можете попробовать эти два варианта, когда получаете сообщение об ошибке: "не удалось найти или загрузить основной класс"

Если файл вашего класса сохранен в следующем каталоге с HelloWorld именем программы d:\sample


  1. java -cp d:\sample HelloWorld

  2. java -cp . HelloWorld

Ответ 4

Я полагаю, вам нужно добавить текущий каталог в путь к классу Java

java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
2023-11-30 04:24 java