Перейти к содержимому

Classpath java что это

  • автор:

coreer

Это пример теоретического принципа динамической линковки библиотек в разработке ПО для java-платформы.
Суть в том, что библиотеки(вернее пакеты целиком или контектные классы) указанные в класспазе, загружаются только тогда, когда это нужно в конкретном месте выполнения приложения.

Вирутальная машина ищет и загружает библиотеки в следующем порядке(это типы библиотек):
1) Классы этапа загрузки — это библиотеки в которых непосредственно нуждается сама платформа java.
2) Классы из JAVA_HOME/jre/lib/ext.
3) Другие библиотеки.

Если первые две библиотеки виртуальная машина сама понужде знает откуда загружать, то вот последние библиотеки непонятно откуда брать.

Для этого нам и нужно пользоваться переменной CLASSPATH. Устанавливать ее мы можем в следующих местах:
1) В глобальных пременных ОС (либо для всех сессий входа в ОС, либо только для поточной сессии).
2) Дополнительным аргументом в утилите cli java.
3) В манифесте jar-архива.

Примеры:
№ 1
У нас есть структура каталогов

/home/user/myprogram/ 
|
---> org/
|
---> mypackage/
|
---> HelloWorld.class
---> SupportClass.class
---> UtilClass.class

Класс HelloWorld — это главный класс приложения.
Если мы находимя в каталоге myprogram, то можем вызвать просто:

java org.mypackage.HelloWorld

Если же мы находимся в любом другом месте, то

java -classpath /home/user/myprogram org.mypackage.HelloWorld
D:\myprogram\ 
|
---> lib\
|
---> supportLib.jar
|
---> org\
|
--> mypackage\
|
---> HelloWorld.class
---> SupportClass.class
---> UtilClass.class
java -classpath D:\myprogram;D:\myprogram\lib\supportLib.jar org.mypackage.HelloWorld
set CLASSPATH=D:\myprogram;D:\myprogram\lib\supportLib.jar
java org.mypackage.HelloWorld

Интересность 1
Можно заметить, что в предыдущих примерах мы переопределяем класспаз для контретного ява-вызова полсностью, тоесть если какие-то библиотеки указаны в глобальной ОС переменной, то они будут перетерты под конкретный вызов. Если же нужно сохранить и эти места библиотек, нужно еще и указать через разделитель(в юникс-системах “:”, в виндовсе “;”) точку “.” Можно увидеть пример в примере следующей интересности.

Интересность 2
Если у нас есть много библиотек запакованных в jar-архивы, которые находятся в одной директории, то мы с версии платформы java 6 можем указать *, и все эти архивы окажутся в класспазе, а не перечислять каждый архив отдельно:

java -classpath ".;c:\mylib\*" MyApp

Интересность 3
Вот так можно узнать какой класспаз в данный момент выполнения приложения:

System.getProperty("java.class.path");

№ 3
Пример с архивом:

D:\myprogram\ 
|
---> helloWorld.jar
|
-----------> lib\
|
---> supportLib.jar
---> supportLib2.jar

В манифесте должно быть:

Main-Class: org.mypackage.HelloWorld
Class-Path: lib/supportLib.jar lib/supportLib2.jar

В таком случае мы можем вызывать так:

java -jar D:\myprogram\helloWorld.jar

Понимаем Classpath в Java и как его устанавливать

Часто при работе с Java-проектом встречается такое понятие, как «Classpath». Это может быть в контексте загрузки ресурсов, например, при работе с шаблонизаторами или при загрузке properties-файлов. Но что же это такое?

Classpath – это переменная окружения, которая сообщает JVM, где искать пользовательские и системные классы. Это может быть путь к директории, где хранятся скомпилированные классы, или путь к jar-файлам.

Пример: представим, что есть приложение, которое использует внешнюю библиотеку. Для того, чтобы приложение могло использовать классы из этой библиотеки, JVM должна знать, где эти классы находятся. Именно в этом и заключается основная функция Classpath.

Но как же задать Classpath?

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

В Windows:
В командной строке можно установить classpath следующим образом:

set CLASSPATH=C:\path\to\classes;C:\path\to\jar\file.jar

В Unix-подобных системах (Linux, MacOS):
В командной строке можно установить classpath следующим образом:

export CLASSPATH=/path/to/classes:/path/to/jar/file.jar

Также Classpath можно указать при запуске java-приложения с помощью опции -cp или -classpath :

java -cp /path/to/classes:/path/to/jar/file.jar com.example.MainClass

Важно отметить, что установка Classpath в командной строке имеет временный характер и действует только в рамках текущей сессии командной строки.

В заключение хотелось бы подчеркнуть, что в большинстве современных IDE (например, IntelliJ IDEA, Eclipse) установка Classpath происходит автоматически при добавлении зависимостей.

Classpath

В большинстве случаев команды java и javac должны найти другие классы необходимые для компиляции и выполнения. Самый распространенный случай — это использование классов входящих в Java SE. Или, например, нам нужно скомпилировать и запустить класс, который использует другие классы, не входящие в Java SE.

Команды java и javac используют следующий алгоритм поиска:

  1. Они используют один и тот же список каталогов, в которых ищут необходимые файлы.
  2. Обе команды в процессе поиска просматривают список каталогов в одном и том же порядке.
  3. Как только необходимый класс найден, процесс поиска прекращается. Если список каталогов содержит два или более классов с одним и тем же именем, используется первый найденный.
  4. Первое место используемое в процессе поиска — это каталоги содержащие классы Java SE.
  5. Второе место — каталоги определенные в так называемом Сlasspath.

Classpath может быть задано двумя способами:

  1. Как переменная окружения CLASSPATH. Команды java и javac используют этот способ по умолчанию.
  2. Как ключ -classpath (или -cp) команд java и javac. Этот способ переопределяет список каталогов заданный переменной окружения, но только для конкретного вызова. Данный метод является более предпочтительным.

Способы задания Classpath Фото

2. Использование ключа -classpath

Рассмотрим использование ключа -cp используя классы first.Example1 и second.Example2 , описанные здесь. Но предположим, что класс 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.

Несколько важных правил при использовании ключа -cp :

  1. Ключ -cp может содержать несколько каталогов, разделенных точкой с запятой, как показано в примере при запуске команды java .
  2. Если указывается подкаталог, это НЕ означает что родительский каталог тоже входит в classpath. Например, для ключа -cp ../projectExample2/classes , каталог ../projectExample2 не будет входить в classpath.
  3. Если используется ключ -cp , то команды javac и java НЕ ищут классы в текущем каталоге по умолчанию. Для указания текущего каталога используется точка. Например:

cd projectExample1/classes java -cp .;../../projectExample2/classes first.Example1​

Презентацию с видео можно скачать на Patreon .

Что такое classpath?

Classpath – это параметр, который указывает приложениям где искать пользовательские классы. По этому адресу должны быть найдены все классы, для которых не применяются специальные загрузчики. На место поиска стандартных классов JRE этот параметр не влияет.

Кроме непосредственно Java-приложений (команда java ), этот параметр применим и для других утилит JDK, таких как javac , javadoc и другие.

Есть два основных способа установки classpath: в переменной окружения ОС CLASSPATH , и в аргументе командной строки -cp (синоним -classpath ). Второй способ предпочтительнее, потому что позволяет устанавливать разные значения для разных приложений. Значение по умолчанию – текущая директория.

В параметре передаются пути к jar-файлам и корневым директориям с пакетами. Пути разделяют символом : в параметре командной строки, или же ; в переменной окружения. Чтобы включить все файлы директории, разрешается использовать в конце пути символ * .

Если приложение запускается из jar-файла ( java -jar ), classpath должен быть указан в его манифесте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *