среда, 27 апреля 2011 г.

CLASSPATH что это такое и с чем его едят?

Это пример теоретического принципа динамической линковки библиотек в разработке ПО для 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

№ 2
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

Комментариев нет:

Отправить комментарий