Classpath — это параметр, определяющий список директорий, JAR- и ZIP-архивов, в которых Java-машина и компилятор ищут классы и ресурсы при запуске приложения.
История вопроса:
С момента появления Java возникла необходимость организовывать загрузку большого числа классов, которые часто лежат в разных директориях. Для этого был придуман classpath, который позволяет гибко указывать места поиска зависимостей.
Проблема:
Если classpath настроен неправильно, приложение не найдёт нужные классы, что приведёт к ошибкам загрузки (например, ClassNotFoundException или NoClassDefFoundError).
Решение:
Classpath можно задавать через переменную окружения CLASSPATH, параметр командной строки -cp или -classpath. Важно явно указывать все директории и JAR-файлы, необходимые для работы приложения. Пример запуска с classpath:
java -cp ".;lib/*" com.example.Main
Ключевые особенности:
; (Windows) или : (Linux/macOS)lib/* — все JAR в папке libМожет ли Java сама находить классы, если они не прописаны в classpath?
Нет, Java не производит автоматического поиска классов вне указанного classpath. Каждый путь должен быть явно прописан или добавлен на шаге сборки или запуска.
Влияет ли порядок путей в classpath на загрузку классов?
Да, при совпадении имён классов первым будет найден класс из первого указанного пути. Порядок важен для избежания конфликтов версий.
Можно ли добавить новый JAR в classpath "на лету" после запуска приложения?
Нет, стандартный механизм classpath статичен после старта JVM. Динамическая загрузка новых классов требует специальных ClassLoader'ов.
Java-приложение запускается с параметром -cp lib/mylib.jar, забывая добавить папку с тестовым конфигом. В результате приложение падает с ошибкой, хотя библиотека вроде бы присутствует.
Плюсы:
Минусы:
Используется maven/gradle, которые сами формируют classpath на основании зависимостей. Запуск производится через wrapper-скрипт.
Плюсы:
Минусы: