У меня возникли проблемы с компиляцией и запуском моего 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
я получаю следующую ошибку: "Error: Could not find or load main class 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));
}
}
Вы должны убедиться, что добавили местоположение файла .class
в classpath. Так, если он находится в текущей папке, добавьте .class
в classpath.
Обратите внимание, что разделителем пути классов в Windows является точка с запятой, т.е. ;
.
Если класс находится в пакете
package thepackagename;
public class TheClassName {
public static final void main(String[] cmd_lineParams) {
System.out.println("Hello World!");
}
}
Потом звонит:
java -classpath . TheClassName
результатов по `ошибка: не удалось найти или загрузить основной TheClassName класса. Это потому, что его надо было бы назвать его полное имя:
java -classpath . thepackagename.TheClassName
И этот каталог thepackagename должен существовать в classpath. В этом примере,
., значение текущего каталога, является совокупностью классов. Поэтому этот конкретный пример должен быть вызван из каталога, в котором
thepackagename` существует.
Чтобы было понятно, название этого класса не TheClassName, она'thepackagename ых.TheClassName. Пытаясь выполнить TheClassName
не работает, потому что нет занятия, что имя существует. Тока не на пути к классу в любом случае.
Наконец, отметим, что скомпилированный файл (.класс) версию, а не исходный код (.на Java) версию. Отсюда и “классов”.
Вы можете попробовать эти два, когда вы получаете сообщение об ошибке: 'не удается найти или загрузить главный класс'
Если ваш класс файл сохраняется в каталоге с именем HelloWorldимя программы
d:\sample`
Ява -СР d:\sample файл HelloWorld
Ява -СР . Файл HelloWorld
Я полагаю, что вам нужно добавить текущий каталог в классовый путь Java
java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
Вы должны указать путь к вашей команды javac и Java для
javac -cp . PackageName/*.java
java -cp . PackageName/ClassName_Having_main
предположим, у вас есть следующие
Пакет: ком.тест Имя класса: Привет (с главной) файл находится внутри и"ГРЦ/ком/тест/Привет.Ява"и
из внешнего каталога:
$ cd src
$ javac -cp . com/test/*.java
$ java -cp . com/test/Hello
Если вы работаете в Eclipse, просто сделать очистку (\проект Чистый..
`очистить все проекты) проекта.
Вы должны установить путь к классу, если вы получаете ошибку:
не удается найти или загрузить главный класс АБВ
Например:
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
когда я должен был удалить `.класса:
javac HelloWorld.java && java HelloWorld
Проверьте ваш buildpath по, это может быть то, что вы ссылаетесь на библиотеку, которая больше не существует.
Если вы'вновь получаю эту ошибку и вы использование Maven для сборки банок, то есть хороший шанс, что вы просто не имеют Java-классов в src/главная/Java/
.
В моем случае я создал мой проект в Eclipse по умолчанию ГРЦ
(а не src/главная/Java/
.
Так что я в конечном итоге с чем-то вроде пакета mypackage.morepackage.класса MyClass
и структуру каталогов, как в src/пакета mypackage/morepackage/класса MyClass
, которая по своей сути не имеет ничего плохого. Но при запуске чистой установки МВНбудем искать
src/главная/Java/пакета mypackage/morepackage/класса MyClass`. Он не найдет класс, но он выиграл'т-либо ошибки. Поэтому он будет успешно строить и вас при запуске выдается банку в результате:
Error: Could not find or load main class mypackage.morepackage.myclass
Потому что он просто никогда не включал свой класс в упакованной банке.
Если вы пытаетесь запустить Java-приложения, который должен с JDK 1.6 и вы пытаетесь работать на JDK 1.4, вы столкнетесь с этой ошибкой. В общем, пытаюсь запустить Java-приложение на старую версию JRE может потерпеть неудачу. Попробуйте установить новый JRE/JDK для.
Я знаю, что этот вопрос был с тегами Linux, но на windows, вам может понадобиться, чтобы отделить ваши аргументы СР с ;
вместо :
.
Ява -СР ./apache-log4j-1.2.16/log4j-1.2.16.jar;./SpatialModel vensim.jar Варс
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
Java с опцией-verbose:класс HelloWorld
может помочь вам понять, какие классы загружаются.
Также, Как упоминалось ранее, не забывайте называть полное имя (т. е. включать в пакет).
Проблема не в вашей основной функции. Проверьте
javac -d . -cp ./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.java VensimHelper.java VensimException.java VensimContextRepository.java
вывод и запустите его.
Я был с использованием Java 1.8, и эта ошибка вдруг произошла, когда я нажал на "строить и чистить" в среде NetBeans. Я переключила на какой-то миг до 1,7 раз, нажал ОК, снова открыл свойства и переключается обратно на 1.8, и все работало отлично.
Я надеюсь, что смогу помочь кому-то с этим, так как эти ошибки могут быть достаточно трудоемким.
Эта проблема возникла для меня, когда я импортировать существующий проект в Eclipse. Что происходит, она скопировала все файлы не в пакете, но вне пакета. Поэтому, когда я попытался запустить > запуск конфигураций, он не мог'т найти основной метод, потому что он не был в пакете. Я всего лишь скопировать файлы в пакет и Eclipse, затем удалось обнаружить основной метод. Так что в конечном счете убедиться, что затмение может найти метод main, убедитесь, что ваш Java-файлы находятся в нужном пакете.
Если все так просто, чем думают многие, включая меня :)
КР проекта каталог/ГНЦ/пакет
там вы должны увидеть yourClass.java затем запустите и javac yourClass.java
в котором будет создать yourClass.class затем компакт-диск из ГРЦ
папку в сборки
папка есть вы можете запустить пакет Java.youClass
Я использую терминал на Mac или вы можете выполнить ту же задачу с помощью командной строки в Windows
Если вы используете Eclipse... я переименовал мой основной файл класса и получил эту ошибку. Я пошел, чтобы "запуска" в конфигураторе и в путь к классу для этого проекта, она перечислила оба файла в путь к классу. Я удалил старый класс, который я переименовал и оставил класс, который имел новое имя и он компилировался и работал нормально.