Не удалось найти или загрузить основной класс Java? Вот как это исправить!
Если вы по-прежнему получаете ошибку «основной класс не найден» в вашем Java-проекте без видимой причины, не волнуйтесь, вы не одиноки.
Как одна из самых непредвиденных и спонтанных ошибок, благодаря тенденции JVM (виртуальная машина Java) придерживаться пути к классам по умолчанию, проблема «основной класс не найден» – это то, что преследует как любителей, так и профессионалов.
Но этот вопрос на самом деле менее пугающий, чем кажется. Читайте дальше, чтобы узнать, как избавиться от этой ошибки раз и навсегда.
Почему не был найден основной класс?
Прежде чем мы попытаемся понять, как и почему JVM не смогла найти основной класс, нам нужно понять концепцию пути к классам в Java.
Что такое Classpath?
Путь к классам – это путь к файлу, по которому среда выполнения Java ищет классы и другие файлы ресурсов. Его можно установить с помощью параметра -classpath при выполнении программы или путем установки системной переменной среды CLASSPATH .
Как следует из названия, это просто путь к файлу, по которому файлы .class можно найти в пакете или каталоге JDK.
Когда JVM не может найти основной класс, это часто связано с тем, что она ищет соответствующие файлы .class в неправильном пути к классам. Конечно, способ исправить эту проблему – вручную указать путь к классам, используя пакеты или указав путь к классам.
На этом этапе, если вы хотите освежить память о классах Java, ознакомьтесь с нашим руководством по созданию классов в Java .
Использование пакетов
Создадим класс под названием Test . Поместите его в пакет под названием testPackage . Пакеты используются в Java для того, чтобы сгруппировать похожие классы вместе или предоставить уникальное пространство имен для классов.
В этом простом примере использование пакета поможет вам наглядно представить, как работает путь к классам Java. В вашем приложении файлового менеджера пакет представлен как независимая папка.
package testPackage;
public class Test {
public static void main(String args[]) {
System.out.println("File successfully found!");
}
}
Теперь откройте новый терминал и убедитесь, что ваш рабочий каталог совпадает с тем, который содержит папку пакета. Вы можете изменить рабочий каталог с помощью команды cd в любой операционной системе.
Скомпилируйте Test.java , выполнив следующую команду:
package testPackage;
javac testPackage/Test.java
Это сохранит скомпилированный двоичный файл (файл .class) в testPackage.
Чтобы запустить скомпилированный класс, вам нужно ввести полное имя класса в командной строке. Полное имя класса Java относится к его имени с префиксом имени пакета. В этом случае это должно выглядеть примерно так:
java testPackage.Test
Этот способ вызова файлов классов также гарантирует, что вы можете вызывать исполняемые файлы из разных пакетов из одного и того же рабочего каталога. Все, что вам нужно сделать, это изменить полное имя класса.
В более продвинутых реализациях мы рекомендуем создавать отдельные подпапки для ваших классов и исходных файлов, чтобы лучше управлять файлами в пакете.
Указание пути к классам вручную
Рекомендуемый способ управления файлами Java – создание отдельных каталогов для исходных файлов и классов. Если вы работаете над проектом, скорее всего, вы уже этим занимаетесь.
Обычно каталог с исходными файлами обозначается как src, а каталог с файлами .class обозначается как классы. Это также способ гарантировать, что вероятность того, что JVM не найдет основной класс, значительно снижена благодаря правильно структурированному каталогу.
Если мы воспользуемся этим методом, то структура каталогов будет выглядеть перед компиляцией так:
|---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
Каждый отступ на приведенной выше иллюстрации соответствует одному уровню файловой иерархии, которому должен следовать ваш проект.
Чтобы скомпилировать это, убедитесь, что ваш рабочий каталог – myFolder. Теперь введите следующую команду:
javac -d classes src/testPackage/Test.java
Исполняемый файл .class следует сохранить в myFolder / classes / testPackage . Соответственно структура файловых каталогов выглядит примерно так:
|---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
| |---testPackage
| |---Test.class
Чтобы запустить файл .class , запустите команду Java с полным именем класса и укажите локальный путь к классам. Каждый путь объявляется относительно рабочего каталога, которым в данном случае является myFolder.
java -classpath classes testPackage
Выполнение этой команды должно дать вам желаемый результат. Но почему для решения простой ошибки требуется столько реорганизации?
Важность организации файлов в Java
Причина появления сообщения «Не удалось найти или загрузить основной класс» заключается в том, что JVM не смогла найти, где хранились ваши файлы .class .
Самый простой способ устранить эту ошибку – указать, где хранятся файлы .class, и явно указать JVM искать там. Это стало возможным благодаря раздельной организации исходных и исполняемых файлов и контролю всего из рабочего каталога.
Когда вы начнете добавлять в проект такие конструкции, как наследование , сложность файловой системы неизбежно возрастет в разы. В таких проектах или даже в тех, где требуется использование файлов JAR или пользовательских библиотек, простая практика разделения файлов и управления ими может сэкономить вам бесчисленные часы устранения неполадок и отладки.
Чтобы узнать больше о том, как classpath работает в Java, и о многочисленных вещах, которыми вы можете управлять, когда дело доходит до запуска вашего кода, вы также можете взглянуть на подробный и удобный справочник Oracle.