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

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