Это пример теоретического принципа динамической линковки библиотек в разработке ПО для java-платформы.
Суть в том, что библиотеки(вернее пакеты целиком или контектные классы) указанные в класспазе, загружаются только тогда, когда это нужно в конкретном месте выполнения приложения.
Вирутальная машина ищет и загружает библиотеки в следующем порядке(это типы библиотек):
1) Классы этапа загрузки -- это библиотеки в которых непосредственно нуждается сама платформа java.
2) Классы из JAVA_HOME/jre/lib/ext.
3) Другие библиотеки.
Если первые две библиотеки виртуальная машина сама понужде знает откуда загружать, то вот последние библиотеки непонятно откуда брать.
Для этого нам и нужно пользоваться переменной CLASSPATH. Устанавливать ее мы можем в следующих местах:
1) В глобальных пременных ОС (либо для всех сессий входа в ОС, либо только для поточной сессии).
2) Дополнительным аргументом в утилите cli java.
3) В манифесте jar-архива.
Примеры:
№ 1
У нас есть структура каталогов
Класс HelloWorld -- это главный класс приложения.
Если мы находимя в каталоге myprogram, то можем вызвать просто:
Если же мы находимся в любом другом месте, то
№ 2
А можем и так:
Интересность 1
Можно заметить, что в предыдущих примерах мы переопределяем класспаз для контретного ява-вызова полсностью, тоесть если какие-то библиотеки указаны в глобальной ОС переменной, то они будут перетерты под конкретный вызов. Если же нужно сохранить и эти места библиотек, нужно еще и указать через разделитель(в юникс-системах ":", в виндовсе ";") точку "." Можно увидеть пример в примере следующей интересности.
Интересность 2
Если у нас есть много библиотек запакованных в jar-архивы, которые находятся в одной директории, то мы с версии платформы java 6 можем указать *, и все эти архивы окажутся в класспазе, а не перечислять каждый архив отдельно:
Интересность 3
Вот так можно узнать какой класспаз в данный момент выполнения приложения:
№ 3
Пример с архивом:
В манифесте должно быть:
В таком случае мы можем вызывать так:
Суть в том, что библиотеки(вернее пакеты целиком или контектные классы) указанные в класспазе, загружаются только тогда, когда это нужно в конкретном месте выполнения приложения.
Вирутальная машина ищет и загружает библиотеки в следующем порядке(это типы библиотек):
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
Комментариев нет:
Отправить комментарий