После прочтения OSGi и Equinox я лучше понимаю загрузчик классов OSGi.
Алгоритм поиска классов
Здесь мы предполагаем, чтопакет пытается загрузить некоторый класс C в пакет P.
- , если P начинается с "java".||P является делегированным при загрузке
return parent.loadClass (C) - , если P импортирован
return exporter.loadClass (C) - , если P экспортируется некоторыми необходимыми пакетами
для каждого экспортера
вернуть exporter.loadClass (C), если найден - , если C найден локально
вернуть C - , если C найден во фрагменте
вернуть C - , если P динамически импортируется
возвращать exporter.loadClass (C) - , если для этого пакета включена загрузка друзей, возвращать BuddyLoader.loadClass (C)
- throw aClassNotFoundException
Шаг 7 не является стандартным поведением OSGi.Equinox добавляет этот шаг.
Шаг 1 гарантирует, что все пакеты java. * Неявно доступны для всех пакетов - их не нужно явно импортировать.Однако все остальные пакеты из JRE должны быть явно импортированы.Это означает, что существует соответствующий экспортер.Спецификация OSGi гласит, что System Bundle должен экспортировать дополнительные пакеты из JRE.
System Bundle известен как org.eclipse.osgi в Equinox.Он поддерживает набор профилей, в котором перечислены стандартные пакеты API, доступные в общих библиотеках классов JRE, таких как J2SE1.4, J2SE1.5 и JCL Foundation.Эти профили не включают в себя специфичные для реализации пакеты, такие как com.sun. * И sun. *, Поскольку они не являются стандартными и доступны не во всех JRE.
В шаге 1 алгоритма загрузки классов упоминается понятиезагрузки делегирования.Это механизм переопределения, который идентифицирует конкретные пакеты, чьи загрузки классов должны исходить из загрузчика родительского класса.Это полезно для доступа к пакетам, которые не являются java. * И не экспортируются каким-либо другим способом.Чтобы получить доступ к таким пакетам, вы можете либо обновить профиль JRE, либо использовать свойство org.osgi.framework.bootdelegation в config.ini, чтобы вывести список доступных префиксов пакетов следующим образом:
org.osgi.framework.bootdelegation=com.sun.*,sun.*