Должны ли пакеты экспорта фрагментов OSGi вносить вклад в их хост?
Я заметил фрагмент у меня использует Export-Package
директива для пакета, который добавлен к его хосту:
Fragment-Host: org.eclipse.jetty.osgi.boot
Export-Package: org.eclipse.jetty.osgi.boot.utils;version="1.0.1.felix"
-buildpath: osgi.core;version=4.3.0,\
org.eclipse.jetty.osgi.boot;version=7.6.1.v20120215
-sources: false
Import-Package: !org.eclipse.jetty.osgi.boot.utils.internal,\
*
Этот пакет добавляет некоторые дополнительные классы в пакет org.eclipse.jetty.osgi.boot.utils на хосте.
В идеале, я думаю, что я должен стремиться сохранить конфиденциальность пакетов, где это возможно, но как насчет этого случая? Ни один из остальной части моего кода не требует org.eclipse.jetty.osgi.boot.utils
,
2 ответа
Из спецификации ядра OSGi (6.0):
Путь к классу пакета узла ищется перед путем к классу фрагмента.
"Этот пакет добавляет новый org.eclipse.jetty.osgi.boot.utils с классами, которые переопределяют классы хоста"
Пакеты фрагментов не могут переопределять классы хост-пакета (если вы это имели в виду).
Если пакет не предназначен для использования другими пакетами, его не следует экспортировать. Пакет хоста может видеть классы и ресурсы своего присоединенного фрагмента, но только если он не имеет того же класса или ресурса.
Принятый ответ @balazs-zsoldos:
Пакеты фрагментов не могут переопределять классы основного пакета.
...правильно в данном конкретном случае, но неверно в целом. Более тонкий ответ будет заключаться в том, что фрагменты не могут переопределять классы пакета хоста, если пакет хоста не был настроен для разрешения этого (что в вашем случае
org.eclipse.jetty.osgi.boot
комплекта нет).
Способ, которым вы настраиваете пакет хоста, чтобы разрешить его, заключается в использовании
Bundle-ClassPath
заголовок. Предположим, у вас есть пакет хоста с прикрепленным фрагментом
B
и имеет следующую запись манифеста:
Bundle-ClassPath: contrib,.
Предположим, загрузчику классов пакета предлагается искать класс
pack.Z
в комплекте. Загрузчик классов пакета будет искать в следующем порядке:
-
A:contrib/pack/Z.class
-
B:pack/Z.class
Таким образом, вы можете видеть, что если ваш
contrib
каталог в пуст или не существует, тогда загрузчик классов пакета попытается загрузить
B:contrib/pack/Z.class
прежде чем он попытается загрузить
A:pack/Z.class
. Но, как видите, это возможно только в том случае, если
A
был специально построен, чтобы позволить это.