пятница, 7 июня 2013 г.

Classpath в деталях

Классы в Java бывают 3 видов:

<jre>/lib (rt.jar ...)%winhome%\Sun\Java\lib\ext
<jre>/lib/ext
-classpath
Part of java platform (bootstrap classes)Java extentions (general ones for all JREs in env, or env-specific ones)Third party & User defined



Для каждого из этих типов классов, в виртульной машине есть свой класс-лоудер. В приложении доступн класс-лоудер класспаза, для него отцовским считается лоудер ектеншинов, а для екстеншина - бутстрапный.
Когда класслоудеру нужно найти класс он обращается сначала к своему родителю и только если последний не нашел, ищет у себя. Поэтому классы ищутся слева направо по таблице.
При выполнении приложения для него класспаз лучше указывать через ключ, чем через системную переменную.
Правила такие:
1) Если нужно поместить конктретный джарник в класспаз:
java -classpath path/to/jar.jar mypack.mysub.MyClass

2) Можно поместить все джарники из каталога:
java -classpath path/to/* mypack.mysub.MyClass


3) Нужен кокретный порядок джарников для поиска по ним:
java -classpath path/to/jarZ.jar;path/to/jarY.jar;path/to/jar11.jar mypack.mysub.MyClass


4) Нам нужны скомпиленные классы. Подгружаются и из дефолтного пакета и те, которые находятся в подкаталогах(в пакетах).
java -classpath otherpath/to/compiled mypack.mysub.MyClass


5) А вот такой прикол дает нам возможность загрузить все джарники с указанного каталога, также класс-файлы которые лежат по соседству, и класс-файлы в подкаталогах, которые отображают реальную пакетную иерархию.
java -classpath somepath/with/compiled-and-jarsinupperlevel;somepath/with/compiled-and-jarsinupperlevel/* mypack.mysub.MyClass

6) Указав при выполнении, что мы собираемсчя запустить приложение из архива jar, через ключ -jar, нужно помнить что ключ -classpath паралельно использовать нельзя -- все необходимые для выполнения библиотеки должны быть либо в архиве, либо на них должны быть правильные ссылки в манифесте архива.

Не получится запускать класс-файлы, если мы класспазимся к нем не из их корня, а из середины.
Если мы класспазимся на несколько разных директорий, но в которых одинаковая структура поддиректорий с классами, то в вирутальной машине это все один пакет и все классы доступны.

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

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