Должны ли пакеты экспорта фрагментов 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в комплекте. Загрузчик классов пакета будет искать в следующем порядке:

  1. A:contrib/pack/Z.class
  2. B:pack/Z.class

Таким образом, вы можете видеть, что если ваш contribкаталог в пуст или не существует, тогда загрузчик классов пакета попытается загрузить B:contrib/pack/Z.classпрежде чем он попытается загрузить A:pack/Z.class. Но, как видите, это возможно только в том случае, если Aбыл специально построен, чтобы позволить это.

Другие вопросы по тегам