Поддержка модулей реализована с помощью структуры OSGi. С этой точки зрения модуль - это то же самое, что и комплект OSGi. Комплект и связанные с ним классы задают и реализуют процесс для загрузки классов Java, предварительное управление и жизненный цикл комплекта. В тексте этого раздела мы будем использовать термины модуль и комплект взаимозаменяемо, кроме случаев, когда идет речь о конкретном классе структуры.
Модуль, выполняющийся в платформе, представляется классом Plugin. В нем собраны все характеристики жизненного цикла и семантики всего модуля. В модуле можно реализовать специальные функции для таких характеристик жизненного цикла, как запуск и останов. Все методы жизненного цикла содержат ссылку на BundleContext, который может предоставить дополнительную информацию.
Об участке запуск стоит поговорить отдельно. Мы уже видели, что информацию о модуле можно получить из файла манифеста для модуля, не выполняя при этом сам код. Как правило, в результате определенных действий пользователя в рабочей среде возникает ряд событий, требующих запуска модуля. С точки зрения реализации модуль не запустится, пока не будет загружен содержащийся в нем класс.
Инициализировать и регистрировать поведение модуля лучше всего в методе start. Однако важно предусмотреть возможность запуска модуля при различных условиях. Иногда вызвать загрузку одного из классов модуля (а значит, и запуск самого модуля) можно просто получив значок для оформления объекта. Слишком быстрая инициализация может привести к загрузке кода и данных модуля задолго до того, как они действительно понадобятся. Следовательно, очень важно внимательно отнестись к инициализации модуля и рассмотреть альтернативный вариант: выполнение инициализации при запуске.
Там, где встречается понятие OSGi "комплект" и понятие платформы "модуль", можно найти и термин "управление жизненным циклом". При запуске модуля ему дается ссылка на BundleContext, из которого берется необходимая для модуля информация.С помощью BundleContext можно также выяснить, есть ли в системе другие комплекты или модули.
Метод BundleContext.getBundles() возвращает массив всех комплектов в системе. Для BundleEvent можно зарегистрировать получателей запросов, с помощью которых модуль будет узнавать об изменении состояния жизненного цикла другого комплекта. Дополнительные сведения о BundleContext и BundleEvent можно найти в документации по java.
В версиях до 3.0 аналогичную информацию предоставлял реестр модуля (IPluginRegistry). Например, из него можно было запросить дескрипторы всех модулей системы. На сегодняшний день реестр устарел и вместо него следует пользоваться для этой цели BundleContext. В реестре платформы сейчас хранится информация исключительно о расширениях и точках расширения.
Поведение при запуске и останове, реализованное в классе Plugin, определяется интерфейсом BundleActivator. Хотя класс Plugin больше подходит для реализации этой функции, разработчику модуля предоставлена полная свобода для реализации интерфейса для BundleActivator в любом другом классе. По сути, если для модуля не требуется управление жизненным циклом, то этот интерфейс в нем можно вообще не реализовывать.
В основе каждого модуля лежит комплект OSGi, управляемый структурой. Комплект - это модульная единица OSGi. По существу, комплект - это просто набор файлов (ресурсов и кода), установленный в платформу. Каждый комплект содержит собственный загрузчик классов Java и протокол для своего запуска, останова и удаления. С точки зрения платформы Eclipse комплект - это просто класс реализации. Для представления модуля разработчики не расширяют класс комплекта, а используют Plugin или другой BundleActivator.