Что такое OSGi и как оно связано с Eclipse IDE?
OSGi (Open Services Gateway initiative) — это спецификация модульной системы для Java. Если говорить простыми словами, OSGi можно представить как «операционную систему для Java-модулей». Она позволяет загружать, обновлять, останавливать и запускать отдельные части приложения без перезапуска всей программы.
Как работали Java-приложения раньше
До появления OSGi большинство Java-приложений представляли собой один исполняемый JAR-файл и набор библиотек.
application.jar
|
+-- library1.jar
+-- library2.jar
+-- library3.jar
Обычно все библиотеки загружались одним ClassLoader'ом. Это приводило к ряду ограничений:
- нельзя использовать две версии одной библиотеки одновременно;
- нельзя выгрузить библиотеку из памяти;
- нельзя обновить библиотеку без перезапуска приложения;
- все библиотеки «видят» друг друга, что усложняет изоляцию модулей.
Что предлагает OSGi
В OSGi каждый модуль называется bundle.
Bundle — это обычный JAR-файл, но содержащий дополнительный файл
META-INF/MANIFEST.MF, в котором описываются зависимости и параметры
модуля.
META-INF/
└── MANIFEST.MF
В этом файле обычно указывается:
- имя bundle;
- версия;
- какие пакеты экспортируются;
- какие пакеты импортируются;
- необходимые зависимости.
Например:
Bundle-SymbolicName: com.example.editor
Bundle-Version: 1.2.0
Export-Package:
com.example.editor.api
Import-Package:
org.eclipse.swt,
org.osgi.framework
Контейнер OSGi
Вместо запуска приложения напрямую:
java -jar app.jar
сначала запускается специальный контейнер — OSGi Framework.
+------------------------+
| OSGi Framework |
| |
| Bundle A |
| Bundle B |
| Bundle C |
| Bundle D |
+------------------------+
Именно он управляет всеми модулями приложения.
Framework умеет:
- устанавливать bundle;
- запускать их;
- останавливать;
- удалять;
- обновлять без полного перезапуска приложения.
Жизненный цикл Bundle
Каждый bundle может находиться в одном из нескольких состояний.
Installed
Resolved
Starting
Active
Stopping
Uninstalled
Для выполнения действий при запуске и остановке обычно используется класс BundleActivator.
public class Activator implements BundleActivator {
@Override
public void start(BundleContext context) {
System.out.println("Started");
}
@Override
public void stop(BundleContext context) {
System.out.println("Stopped");
}
}
Почему Eclipse построен на OSGi
Практически весь Eclipse представляет собой набор OSGi-модулей. При запуске IDE сначала запускается реализация OSGi под названием Equinox, после чего она загружает необходимые bundle.
Почти каждая возможность Eclipse является отдельным модулем:
Eclipse
├── Java Editor
├── Git
├── Maven
├── CDT
├── Debugger
├── Help
├── SWT
├── JDT
└── PDE
Это реальные отдельные bundle, например:
org.eclipse.swt
org.eclipse.jdt.core
org.eclipse.jdt.ui
org.eclipse.core.runtime
org.eclipse.ui
Благодаря этому можно легко устанавливать новые плагины и отключать ненужные.
Как работают плагины Eclipse
Когда пользователь устанавливает новый плагин через меню Help → Install New Software, Eclipse фактически добавляет новый bundle в контейнер OSGi.
OSGi.installBundle(...)
resolve()
start()
После этого плагин становится частью работающей IDE.
Обновление модулей
OSGi позволяет заменить старую версию bundle новой:
org.eclipse.egit 6.0
↓
org.eclipse.egit 6.1
Хотя для некоторых обновлений Eclipse всё же предлагает перезапуск, архитектура OSGi позволяет выполнять подобные операции значительно гибче, чем обычные Java-приложения.
Equinox
Equinox — это реализация спецификации OSGi, разработанная командой Eclipse. Именно она используется внутри Eclipse IDE.
Другие популярные реализации:
- Apache Felix;
- Knopflerfish.
Все они реализуют одну и ту же спецификацию OSGi.
Eclipse RCP
На базе Eclipse можно создавать собственные настольные приложения. Такой подход называется Eclipse Rich Client Platform (RCP).
My CAD
├── Editor
├── Project Explorer
├── Properties
├── Logging
├── Update Manager
└── Preferences
Каждый элемент такого приложения также является отдельным bundle.
Plugin Development Environment (PDE)
Для разработки плагинов Eclipse существует специальный набор инструментов — Plugin Development Environment (PDE).
В проект автоматически добавляются файлы:
plugin.xml
MANIFEST.MF
Файл MANIFEST.MF содержит информацию о зависимостях OSGi, а
plugin.xml описывает вкладки, меню, команды, представления и другие
расширения интерфейса Eclipse.
Пример объявления зависимости
В обычном Java-проекте библиотека добавляется в classpath. В OSGi достаточно объявить зависимость.
Например:
Require-Bundle:
org.eclipse.swt
или импортировать нужные пакеты:
Import-Package:
org.eclipse.swt.widgets
После этого OSGi Framework самостоятельно найдёт подходящий bundle.
Итоги
Без OSGi приложение обычно выглядит так:
Большое приложение
│
▼
множество JAR-файлов
С использованием OSGi архитектура становится значительно более модульной:
OSGi Framework
│
┌─────────────┼─────────────┐
│ │ │
Bundle A Bundle B Bundle C
│ │ │
Export API Import API Export API
Каждый bundle имеет собственный жизненный цикл, явно описывает зависимости, может обновляться независимо от остальных модулей и предоставляет только те пакеты, которые были явно экспортированы.
Именно поэтому Eclipse считается одним из наиболее известных и успешных проектов, построенных на основе OSGi.
