← Назад к вопросам

Что такое classpath?

1.6 Junior🔥 121 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое classpath

Classpath - это путь, по которому Java Virtual Machine (JVM) ищет классы, ресурсы и библиотеки при запуске приложения. Это один из самых важных концептов в Java, и каждый разработчик должен его понимать.

Как это работает

Когда Java код вызывает какой-то класс, JVM не загружает его в памяти сразу. Вместо этого она пытается найти этот класс по пути, указанному в classpath. Если класс не найден, выбросится ClassNotFoundException.

// Когда вы пишете
User user = new User();

// JVM пытается найти файл User.class в директориях, указанных в classpath
// Для примера, если classpath = "/home/project/target/classes"
// То JVM будет искать файл
// /home/project/target/classes/com/mycompany/User.class

Структура classpath

Classpath содержит:

  1. Скомпилированные классы (.class файлы)
project/
├── src/
│   └── main/java/
│       └── com/company/
│           └── User.java
├── target/
    └── classes/              # <- Сюда компилятор кладёт .class файлы
        └── com/company/
            └── User.class

В этом случае classpath = target/classes

  1. JAR файлы (библиотеки)
// classpath может содержать
/home/user/.m2/repository/org/junit/junit/4.13/junit-4.13.jar
/home/user/.m2/repository/org/springframework/spring-core/5.3/spring-core-5.3.jar

// JVM может загружать классы из этих JAR файлов
import org.junit.Test;  // Класс будет найден в junit-4.13.jar
  1. Ресурсы (конфиг файлы, properties)
src/
└── main/
    ├── java/
    │   └── com/company/
    │       └── Application.java
    └── resources/
        ├── application.properties
        ├── log4j.properties
        └── messages.properties

Эти файлы тоже должны быть в classpath, чтобы их можно было загружать:

// Загрузить файл из classpath
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("application.properties");

Как задать classpath

1. Через командную строку (java -cp)

# Один файл
java -cp target/classes com.company.Application

# Несколько файлов, разделённые : (на Linux/Mac) или ; (на Windows)
java -cp "target/classes:lib/junit-4.13.jar:lib/spring-core-5.3.jar" com.company.Application

# Все JAR файлы в директории
java -cp "target/classes:lib/*" com.company.Application

2. Через переменную окружения CLASSPATH

export CLASSPATH=/path/to/classes:/path/to/lib/*
java com.company.Application

3. Через MANIFEST.MF в JAR файле

Manifest-Version: 1.0
Main-Class: com.company.Application
Class-Path: lib/junit-4.13.jar lib/spring-core-5.3.jar

4. Через Maven (самый удобный способ)

Maven автоматически собирает classpath из зависимостей в pom.xml:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
    </dependency>
</dependencies>

Затем выполняем:

mvn clean compile
mvn exec:java -Dexec.mainClass="com.company.Application"

Maven автоматически добавит все зависимости в classpath.

Частые проблемы

ClassNotFoundException

exception in thread "main" java.lang.ClassNotFoundException: org.junit.Test
// Это значит, что junit JAR файл не в classpath

Порядок в classpath важен

# Если в classpath есть две версии одного класса,
# JVM загрузит версию из первого JAR файла, который найдёт
java -cp "lib/spring-5.3.jar:lib/spring-5.2.jar" com.company.Application
# Загрузится spring-5.3.jar

Resources не найдены

// Проблема: src/main/resources не был скопирован в target/classes
// Решение: использовать Maven, он сам скопирует ресурсы
InputStream is = getClass().getResourceAsStream("/application.properties");

IDE автоматически управляет classpath

В IntelliJ IDEA и Eclipse classpath управляется автоматически:

  • IDE знает все зависимости проекта
  • IDE добавляет target/classes и src/main/resources в classpath
  • IDE добавляет все JAR файлы из .m2 репозитория

Вот почему код работает в IDE, но может не работать при запуске из командной строки - если вы не правильно указали classpath.

Резюме

Classpath - это путь для поиска классов и ресурсов. Это один из самых важных концептов в Java. Неправильный classpath - частая причина ClassNotFoundException. Maven и IDE управляют этим автоматически, но понимать, как это работает, критично для разработчика.