Ошибка: не удалось найти или загрузить основной класс
У меня возникают проблемы при компиляции и запуске моего 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));
}
}
22 ответа
Вы должны убедиться, что вы добавляете местоположение вашего .class
файл к вашему classpath. Таким образом, если его в текущей папке, то добавьте .
к вашему классу. Обратите внимание, что разделитель пути к классам Windows является точкой с запятой, т.е. ;
Если класс находится в пакете
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). Отсюда "CLASSPATH".
Вы можете попробовать эти два, когда получаете сообщение об ошибке: "не удалось найти или загрузить основной класс"
Если ваш файл класса сохранен в следующем каталоге с HelloWorld
название программыd:\sample
java -cp d:\sample HelloWorld
java -cp . HelloWorld
Я считаю, что вам нужно добавить текущий каталог в Java classpath
java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
Вы должны включить classpath в ваши команды javac и java
javac -cp . PackageName/*.java
java -cp . PackageName/ClassName_Having_main
Предположим, у вас есть следующее
Имя пакета: com.test Имя класса: Hello (имеющий основной) файл находится внутри "src/com/test/Hello.java"
из внешнего каталога:
$ cd src
$ javac -cp . com/test/*.java
$ java -cp . com/test/Hello
- В windows тоже будет работать то же самое, я уже пробовал
Если вы работаете в Eclipse, просто сделайте очистку (project\clean..
clean all projects
) проекта.
Вы должны установить classpath, если вы получаете ошибку:
Не удалось найти или загрузить основной класс XYZ
Например:
E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.java
E:\>java XYZ
Я получил эту ошибку, потому что я пытался запустить
javac HelloWorld.java && java HelloWorld.class
когда я должен был удалить .class
:
javac HelloWorld.java && java HelloWorld
Проверьте ваш BuildPath, возможно, вы ссылаетесь на библиотеку, которая больше не существует.
Если вы получаете эту ошибку и используете Maven для создания JAR-файлов, есть большая вероятность, что у вас просто нет классов Java в src/main/java/
,
В моем случае я создал свой проект в Eclipse, который по умолчанию src
(скорее, чем src/main/java/
,
Так что я закончил с чем-то вроде mypackage.morepackage.myclass
и структура каталогов выглядит как src/mypackage/morepackage/myclass
, который по своей сути не имеет ничего плохого. Но когда ты бежишь mvn clean install
это будет искать src/main/java/mypackage/morepackage/myclass
, Он не найдет класс, но и не выдаст ошибку. Таким образом, он будет успешно собран, и вы, когда вы запустите свой Jar-файл, получите:
Error: Could not find or load main class mypackage.morepackage.myclass
Потому что он просто никогда не включал ваш класс в упакованный Jar.
Я знаю, что этот вопрос был помечен с Linux, но в Windows вам может понадобиться разделить ваши аргументы cp с помощью ;
вместо :
,
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
Если вы попытаетесь запустить приложение Java, которому требуется JDK 1.6, и вы попытаетесь запустить JDK 1.4, то вы столкнетесь с этой ошибкой. В общем, попытка запустить Java-приложение на старом JRE может закончиться неудачей. Попробуйте установить новый JRE/JDK
Проблема не в вашей основной функции. Проверьте для
javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java VensimHelper.java VensimException.java VensimContextRepository.java
выход и запустить его.
java -verbose:class HelloWorld
может помочь вам понять, какие классы загружаются.
Также, как упоминалось ранее, не забудьте назвать полное имя (например, включить пакет).
Project > Clean и затем убедитесь, что BuildPath > Libraries имеет правильную библиотеку.
Я использовал Java 1.8, и эта ошибка внезапно произошла, когда я нажал "Построить и очистить" в NetBeans, я переключился на короткое время на 1.7, нажал "ОК", снова открыл свойства и переключился обратно на 1.8, и все работало отлично.
Я надеюсь, что могу помочь кому-то с этим, эти ошибки могут занимать довольно много времени.
Эта проблема возникла у меня, когда я импортировал существующий проект в Eclipse. Что происходит, так это то, что он скопировал все файлы не в пакете, а вне пакета. Следовательно, когда я попытался запустить> запустить конфигурацию, он не смог найти метод main, потому что его не было в пакете. Все, что я сделал, это скопировал файлы в пакет, и тогда Eclipse смог обнаружить основной метод. В конечном итоге убедитесь, что Eclipse может найти ваш основной метод, убедившись, что ваши java-файлы находятся в правильном пакете.
Если так просто, как думают многие, меня включили:)
кд Project Folder/src/package
там вы должны увидеть yourClass.java, а затем запустить javac yourClass.java
который создаст yourClass.class, а затем cd из src
папка и в build
папку там можно запустить java package.youClass
Я использую терминал на Mac или вы можете выполнить ту же задачу с помощью командной строки в Windows
Если вы используете Eclipse... Я переименовал свой основной файл класса и получил эту ошибку. Я перешел в конфигуратор "Запуск от имени" и в пути к классу для этого проекта он перечислил оба файла в пути к классам. Я удалил старый класс, который я переименовал, и оставил класс с новым именем, он был скомпилирован и работал нормально.
Это решило проблему для меня сегодня:
cd /path/to/project
cd build
rm -r classes
Затем очистите и соберите его и запустите нужные файлы.
У меня похожая проблема в Windows, она связана с classpath. В командной строке перейдите в каталог, где находится ваш Java-файл (*.java и *.class), затем повторите попытку с вашими командами.
Я использую Anypoint Studio (IDE на основе Eclipse). В моем случае все работало хорошо, пока я не обнаружил, что во время выполнения кода Java выполняется что-то совершенно другое. Затем я удалил файлы.class. После этого я получил сообщение об ошибке из названия этого вопроса. Очистка проекта не решила проблему.
После перезапуска IDE все снова заработало.