Ключи classpath и sourcepath в Java
В этой статье мы рассмотрим как использовать для компиляции и запуска Java программ ключи -sourcepath и -classpath.
- Компиляция с помощью -sourcepath
- Что такое Classpath
- Использование ключа -classpath
- Ключевые моменты
1. Компиляция с помощью -sourcepath
Ключ sourcepath указывает на каталоги, в которых компилятору необходимо искать иерархию исходных файлов.
Рассмотрим пример, в котором имеется два класса находящихся в разных пакетах - first.Example1 и second.Example2. Класс first.Example1 создает экземпляр объекта second.Example2:
package first;
import second.Example2;
public class Example1 {
public static void main(String[] args) {
Example2 example2 = new Example2();
System.out.print("Done!");
}
}
package second;
public class Example2 {
} И имеется следующая структура каталогов:

Давайте попробуем скомпилировать Example1.java так, как делали это ранее:
cd project1
javac –d classes src/first/Example1.java Результат компиляции:
src\first\Example1.java:9: error: package second does not exist
second.Example2 example2 = new second.Example2();
^
src\first\Example1.java:9: error: package second does not exist
second.Example2 example2 = new second.Example2();
^
2 errors Ошибки произошли из-за того, что хотя javac и знал, где найти Example1.java, но он не знал, где находится Example2.java. Для решения этой проблемы используется ключ sourcepath, указывающий на каталоги, в которых компилятору необходимо искать иерархию исходных файлов. В нашем случае это src. Перепишем строку компиляции:
javac -d classes -sourcepath src src/first/Example1.java Теперь программа компилируется без ошибок. Следует обратить внимание, что javac также скомпилировал файл Example2.java, на который ссылается скомпилированный файл Example1.java.
Ключ sourcepath может содержать несколько каталогов, отделенных точкой с запятой, хотя обычно в этом нет необходимости. Например, если нужно включить как локальный каталог src, так и каталог C:\projects\anotherproject\src, где хранится исходный код для другого проекта, то используем следующую команду:
javac -d classes -sourcepath src;C:\projects\anotherproject\src
src/first/Example1.java Стоит заметить, что данная команда не компилирует каждый файл, найденный в какой-либо из этих иерархий. Она компилирует только файлы, на которые прямо или косвенно ссылается единичный компилируемый файл .java.
2. Что такое Classpath
В большинстве случаев команды java и javac должны найти другие классы необходимые для компиляции и выполнения. Самый распространенный случай - это использование классов входящих в Java SE. Или, например, нам нужно скомпилировать и запустить класс, который использует другие классы, не входящие в Java SE.
Команды java и javac используют следующий алгоритм поиска:
- Они используют один и тот же список каталогов, в которых ищут необходимые файлы.
- Обе команды в процессе поиска просматривают список каталогов в одном и том же порядке.
- Как только необходимый класс найден, процесс поиска прекращается. Если список каталогов содержит два или более классов с одним и тем же именем, используется первый найденный.
- Первое место используемое в процессе поиска - это каталоги содержащие классы Java SE.
- Второе место - каталоги определенные в так называемом Сlasspath.
Classpath может быть задано двумя способами:
- Как переменная окружения CLASSPATH. Команды
javaиjavacиспользуют этот способ по умолчанию. - Как ключ -classpath (или -cp) команд java и javac. Этот способ переопределяет список каталогов заданный переменной окружения, но только для конкретного вызова. Данный метод является более предпочтительным.

3. Использование ключа -classpath
Рассмотрим использование ключа -cp используя классы first.Example1 и second.Example2, описанные в уроке 'Компиляция с помощью -sourcepath'. Но предположим, что класс second.Example2 находится в другом проекте и доступны только его .class файлы. На рисунке изображена схема каталогов для данного примера:

Следующая команда будет использована для компиляции first.Example1 класса, где ключ -cp указывает на расположение .class файла second.Example2:
cd projectExample1
javac -d classes -cp ../projectExample2/classes src/first/Example1.java
Для запуска программы используется команда:
cd projectExample1
java -cp classes;../projectExample2/classes first.Example1 Ключ -cp указывает расположение .class файла second.Example2 (как и при компиляции), а также путь для поиска .class файла first.Example1 - classes.
4. Ключевые моменты
Несколько важных правил при использовании ключей -cp и -sourcepath:
- Ключ -sourcepath указывает каталоги, в которых компилятор должен искать иерархию исходных файлов.
- Ключ -sourcepath может содержать несколько каталогов, разделенных точкой с запятой.
- -sourcepath может содержать относительные и абсолютные пути.
- Ключ -cp может содержать несколько каталогов, разделенных точкой с запятой, как показано в примере при запуске команды java.
- Если указывается подкаталог, это НЕ означает что родительский каталог тоже входит в classpath. Например, для ключа -cp
../projectExample2/classes, каталог ../projectExample2 не будет входить в classpath. - Если используется ключ -cp, то команды javac и java НЕ ищут классы в текущем каталоге по умолчанию. Для указания текущего каталога используется точка. Например:
cd projectExample1/classes java -cp .;../../projectExample2/classes first.Example1 - Если ключ -cp НЕ используется, компилятор вносит текущую рабочую директорию (.) в classpath.
- Ключ -cp может содержать относительные и абсолютные пути.
Презентацию с видео можно скачать на Patreon.
Курс 'Java для начинающих' на Udemy
Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.