Ошибка: не удалось найти или загрузить основной класс
У меня возникли проблемы с компиляцией и запуском моего кода 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
в ваш путь к классам. Так что, если его в текущей папке, добавьте .
к вашему классу. Обратите внимание, что разделитель пути к классам Windows является точкой с запятой, то есть a ;
,
Ответ 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
, It thepackagename.TheClassName
. Попытка выполнить TheClassName
не работает, потому что не существует класса, имеющего это имя. В любом случае, не на текущем пути к классу.
Наконец, обратите внимание, что скомпилирована (.class) версия, а не версия исходного кода (.java). Следовательно, "CLASSPATH."
Ответ 3
Вы можете попробовать эти два, когда получаете ошибку: "не удалось найти или загрузить основной класс"
Если ваш файл класса сохраняется в следующей директории с именем HelloWorld
d:\sample
-
java -cp d:\sample HelloWorld
-
java -cp . HelloWorld
Ответ 4
Я считаю, что вам нужно добавить текущий каталог в путь класса Java
java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
Ответ 5
Вы должны включить 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
- В окнах тоже будет работать то же самое, я уже пробовал
Ответ 6
Если вы работаете в Eclipse, просто выполните очистку (project\clean..
clean all projects
) проекта.
Ответ 7
Вы должны установить путь к классу, если получите ошибку:
Не удалось найти или загрузить основной класс XYZ
Например:
E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.java
E:\>java XYZ
Ответ 8
Я получил эту ошибку, потому что я пытался запустить
javac HelloWorld.java && java HelloWorld.class
когда я должен был удалить .class
:
javac HelloWorld.java && java HelloWorld
Ответ 9
Проверьте ваш BuildPath
, возможно, вы ссылаетесь на библиотеку, которая больше не существует.
Ответ 10
Если вы попытаетесь запустить приложение Java, которому требуется JDK 1.6, и вы пытаетесь запустить JDK 1.4, вы столкнетесь с этой ошибкой. В общем, попытка запустить приложение Java на старом JRE может закончиться неудачей. Попробуйте установить новый JRE/JDK.
Ответ 11
Я знаю, что этот вопрос был отмечен с помощью linux, но в окнах вам может потребоваться отделить ваши аргументы 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
Ответ 12
Если вы получаете эту ошибку, а вы используете Maven для создания своих Jars, то есть хороший шанс, что у вас просто нет классов 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.
Ответ 13
Проблема не в вашей основной функции. Проверьте
javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java VensimHelper.java VensimException.java VensimContextRepository.java
и запустите его.
Ответ 14
Проект > Очистите, а затем убедитесь, что BuildPath > Библиотеки имеют правильную библиотеку.
Ответ 15
java -verbose:class HelloWorld
может помочь вам понять, какие классы загружаются.
Кроме того, как упоминалось ранее, не забудьте вызвать полное квалифицированное имя (т.е. включить пакет).
Ответ 16
Я использовал Java 1.8, и эта ошибка внезапно возникла, когда я нажал "Построить и очистить" в NetBeans. Я ненадолго переключился на 1.7, нажал ОК, снова открыл свойства и снова переключился на 1.8, и все заработало отлично.
Я надеюсь, что смогу помочь кому-то с этим, так как эти ошибки могут занимать довольно много времени.
Ответ 17
Эта проблема возникла для меня, когда я импортировал существующий проект в eclipse. Что происходит, он копирует все файлы, не входящие в пакет, но вне пакета. Следовательно, когда я попытался запустить > run configurations, он не смог найти главный метод, потому что он не был в пакете. Все, что я сделал, это скопировать файлы в пакет, и Eclipse смог обнаружить основной метод. Поэтому в конечном счете убедитесь, что Eclipse может найти ваш основной метод, убедившись, что ваши java файлы находятся в правильном пакете.
Ответ 18
Если так просто, как думают многие люди, я включил:)
cd to Project Folder/src/package
, вы должны увидеть, что yourClass.java затем запустил javac yourClass.java
, который создаст ваш class.class, затем cd из папки src
и в папку build
вы можете запустить java package.youClass
Я использую терминал на Mac или вы можете выполнить ту же задачу с помощью командной строки в окнах
Ответ 19
Если вы используете Eclipse... Я переименовал свой основной файл класса и получил эту ошибку. Я пошел в конфигуратор "Запускать как" и в рамках пути к этому проекту он перечислил оба файла в пути к классу. Я удалил старый класс, который я переименовал, и оставил класс, у которого было новое имя, и скомпилировался и работал нормально.
Ответ 20
Сегодня это решило проблему:
cd /path/to/project
cd build
rm -r classes
Затем очистите и создайте его и запустите отдельные файлы, которые вам нужны.
Ответ 21
У меня аналогичная проблема в Windows, она связана с classpath. В командной строке перейдите к каталогу, в котором он разместил ваш файл Java (*.java и *.class), затем повторите попытку с помощью ваших команд.
Ответ 22
Я использую Anypoint Studio (интегрированную среду Eclipse). В моем случае все работало хорошо, пока я не узнал, что при запуске java-кода выполняется совершенно другое. Затем я удалил файлы .class. После этого момента я получил сообщение об ошибке из этого вопроса. Очистка проекта не решила проблему.
После перезагрузки IDE все снова работало хорошо.