https://docs.osgi.org/specification/osgi.core/7.0.0/index.html
Если вкратце, то OSGI – это модульный слой в Java. Позволяет логически разделить проект на
бандлы = .jar, в дополнение может устанавливать им модификаторы доступа: public, private и
protected (build.properties). Касательно жизненного слоя предоставляет возможность
динамически подгружать бандлы в собранный проект (администрирование). Сервисный слой –
все это реализует.
Для каждого бандла есть класс Activator, который наследуется от BundleActivator, там два метода:
stop() и start(). start() регистрирует сервисы в регистре сервисов, stop() убирает
зарегистрированные сервисы (по умолчанию он и так это делает). Фреймворк OSGI проверяет все
имплементации BundleActivator.
Визуальное отличие модульной и немодульной построения системы (там внизу еще есть папка
launcher, она оказывается тоже используется):
Сам по себе launcher.jar универсальный, при его запуске указывается путь к пакету бандлов
В классе Main создается list бандлов, из пути указанному в передаваемых параметрах
(java -Djava.specification.version=1.8 -jar launcher.jar bundles):
Bundle-ManifestVersion: 2 –> так как OSGI не всегда имел своего рода определенные стандарты,
только 2-ая версия определяет использование Bundle-SymbolicName.
Жизненный цикл
В отличие от модульного слоя, который зависит от метаданных, жизненный цикл зависит от API.
Apache Felix, Eclipse Equinox, and Knopflerfish – все это реализации фрэймворка OSGI, своего рода
оболочка. Сама оболочка написана на джаве и взаимодействует с фреймворком OSGI в лаунчере
посредством интерефейса BundleActivator:
Через telnet (telnet localhost 7070) можно обратиться к шеллу и установить бандлы по порядку:
И так далее, все запускается и останавливается в режиме онлайн:
BundleActivator – устанавливает правило, что класс будет использовать методы .start() и .stop() –
аналог main (main уже есть в лаунчере, где поэтапно вызываются бандлы).
BundleContext (https://docs.osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html) –
позволяет бандлу взаимодействовать с фреймворком, включает методы Register, Retrieve, Get,
Install и прочие. Создается для бандла, называется так благодаря используемому паттерну State
(Состояние – Контекст хранит ссылку на объект состояния и делегирует ему работу, зависящую от
внутреннего состояния, для большего понимания лучше ознакомиться с самим паттерном -
https://ru.wikipedia.org/wiki/Состояние_(шаблон_проектирования)) – команда install.
Bundle – этот интерфейс создается для каждого установленного бандла (который .jar), определяет
способы управления жизненным циклом установленного бандла (пример которого также можно
посмотреть в вышеописанном паттерне) – команды start, stop (the result of Bundle.start() depends
on the current state of the associated bundle. If the bundle INSTALLED, it transitions to ACTIVE via the
RESOLVED and STARTING states. If the bundle is UNINSTALLED, the method throws an
IllegalStateException). Если у бандла есть активатор, вызывается BundleActivator.start().
## После установки бандла фреймворк больше не нуждается в исходном .jar файле, так как
сохраняет копию в bundle cache.