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

У меня возникают проблемы при компиляции и запуске моего 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

  1. java -cp d:\sample HelloWorld
  2. 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 все снова заработало.

Другие вопросы по тегам