Ответ 1
Когда мы начинали с OSGi в 1998 году, у нас были четкие требования, но, конечно, не было четкого представления о том, что из этого выйдет. Итак, мы начали явно моделировать требования и возможности, которые у нас были: пакеты. Пакет импорта требует возможности, и эта возможность предоставляется пакетом экспорта.
В 2003 году Eclipse хотела начать использовать OSGi, но им нужно было средство, чтобы требовать другой пакет, им не понравилась идея экспорта и импорта всех своих пакетов. На самом деле, в то время они не видели преимущества пакетов. Чтобы удовлетворить их, мы добавили Require-Bundle и Fragment-Host (еще одно их желание, которое оказалось не таким хорошим).
После того, как мы указали OSGi 4.x с этими расширениями, мы начали думать о репозитории, Ричард разработал Oscar Bundle Repository. Анализируя ситуацию с новыми заголовками в OSGi 4.0, стало ясно, что реализация Import-Package во многом напоминала Require-Bundle и даже напоминала обработку Fragment-Host.
В 2006 году Ричард С. Холл и я написали RFC 112, предлагая более общую модель, которая охватила семантику существующей модели зависимостей, но не была специфичной для каждого типа требований. То есть для распознавателя Framework файлы Import-Package и Require-Bundle различаются только по пространству имен. Думая об импорте-пакете как об общем требовании и об экспорте-пакете как об общем способе, модель репозитория была предельно простой. Более того, он был расширяемым, поскольку мы всегда могли добавить больше пространств имен. Это сделало распознаватель полностью независимым от фактически используемых пространств имен.
После нескольких очень жарких дискуссий экспертная группа по OSGi Core Platform решила принять основную идею и разработала спецификации требований и возможностей. Хотя изначально это была модель для хранилища, она оказалась очень полезной для самой платформы. Поэтому мы решили адаптировать существующие спецификации к этой модели. OSGi 4.3 внутренне моделирует Import-Package, Export-Package, Require-Bundle и т.д. В качестве требований и возможностей ресурса (связки). Для обратной совместимости мы сохранили существующие заголовки, но они внутренне переведены на требования и возможности.
Тогда наконец ответим на ваш вопрос. Со временем спецификации OSGi добавили все больше и больше пространств имен. Пространство имен похоже на тип для требования и возможности. Он определяет семантику набора свойств Capability в этом пространстве имен. Требование - это выражение фильтра, которое утверждается в этих свойствах. Ресурс имеет набор возможностей, которые предоставляются среде выполнения при выполнении всех его требований. Задача Resolver состоит в том, чтобы найти набор ресурсов, которые бы удовлетворяли друг другу возможности и возможности, предоставляемые средой выполнения.
Например, мы добавили пространство имен osgi.ee
, которое точно определяет, на какой виртуальной машине может работать пакет. Мы добавили пространство имен osgi.extender
, которое моделирует зависимость от внешней программы, такой как Service Component Runtime (SCR). Большинство компонентов SCR не требуют какого-либо пакета от самого SCR, мы старались сделать их как можно более независимыми. Однако компонент SCR будет бесполезен, если только некоторый пакет во время выполнения не обеспечивает функциональность SCR. Обратите внимание, что это не может использовать Require-Bundle, потому что есть несколько реализаций SCR. Я думаю, что есть около 20 пространств имен. Каждое пространство имен определено в классе Namespace
.
Эта модель дала OSGi ряд преимуществ:
- Сплоченность Несмотря на то, что в спецификацию добавлено много пространств имен, реализации преобразователя никогда не приходилось менять, поскольку они работали над общей моделью.
- Подробно комплекты OSGi уникальны в том, что они описывают свои зависимости очень детально. Все известные мне модульные системы, как правило, используют простую зависимость между модулями, которая не допускает подстановку.
- Гибкость Поскольку Framework изменяет зависимости между пакетами, во время выполнения можно использовать эти зависимости. Например, в OSGi enRoute я связал пакет с его веб-страницей, проходящей по этим временным цепям.
Лично я считаю модель требований и возможностей OSGi одним из ее самых секретных секретов. Насколько я понимаю, его можно использовать во многих областях для улучшения многих проектов разработки в мире разработки программного обеспечения.
Единственная неутешительная часть этого вопроса заключается в том, что я подумал, что мы довольно хорошо описали это в базовой спецификации? :-)