Как использовать OSGi из Java-приложения - PullRequest
2 голосов
/ 03 мая 2010

Я новичок с OSGi, но это интересно. Можно ли взаимодействовать между OSGI-пакетами и Java-приложением? Если это возможно, то как? спасибо!

Суть в том, что у меня есть большое приложение Java SE (автор - другой программист) со многими зависимостями. Во-первых, моя цель - добавить новые функциональные возможности, а во-вторых, изменить архитектуру. Я попытаюсь использовать OSGi, но я не хочу писать код дважды, по этой причине я хочу сейчас писать новый код в виде пакетов. Но используйте эту новую функциональность из старого приложения.

Ответы [ 3 ]

10 голосов
/ 04 мая 2010

Да! Да! и да! Это идеальный способ начать использовать преимущества OSGi и перейти к сервисному приложению.

Создать инфраструктуру с помощью API запуска 4.2 просто, даже не зная, какую реализацию платформы вы используете. Затем вы получаете объект Framework, который на самом деле является OSGi Bundle и может предоставить вам BundleContext. Это вы можете использовать для установки пакетов. Все это описано в спецификации, но вы можете найти много конкретных и отличных примеров в Феликсе: http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html. Феликс явно продвигал встроенные в приложения с первого дня.

Сложной частью этого подхода будет привыкание к модульности и ее ограничениям. Чтобы быть полезным, вам придется делить классы между пакетами OSGi и вашим приложением; это требует явного экспорта этих общих пакетов из вашего приложения с использованием свойства org.osgi.framework.systempackages.extra. Это свойство является заголовком Export-Package для вашего приложения.

Импорт пакетов из пакетов в платформе невозможен из-за модели загрузки классов в Java. Это означает, что код вашего приложения может использовать сервисы только из среды, в которой пакеты для этих сервисов находятся в пути к классам приложений.

Результатом этого является то, что новая функциональность имеет тенденцию переходить в пакеты, где есть полная видимость: как экспортированные пакеты приложений, так и любые пакеты. Тем не менее, это, вероятно, именно то, что вы хотите.

Так что знайте об этой потенциальной ловушке. Вставьте, а затем со временем перенесите весь свой код в пакеты, чтобы ваше приложение стало только средством запуска OSGi. Тем не менее, имейте в виду ваши пакеты, совместно используемые двумя средами.

Удачи, и дайте нам знать, как это происходит.

1 голос
/ 03 мая 2010

Я вижу OSGi как технологию структурирования. Вы можете использовать его для определения структуры компонентов вашего приложения. Таким образом, все ваше приложение представляет собой набор OSGi-пакетов. Следовательно, взаимодействие не является проблемой, просто различные части вашего приложения взаимодействуют обычным образом.

[Отредактировано после уточнения комментария.]

У вас есть фундаментальное решение: ваш код OSGi будет выполняться в том же процессе, что и исходный, или в отдельном процессе?

Разделение подразумевает свободу структурировать новый код по вашему желанию, используя OSGi, но за счет сложности межпроцессного взаимодействия и снижения производительности. Вполне вероятно, что в конечном итоге вы внесете существенные изменения в существующее приложение, чтобы поддерживать удаленное взаимодействие в той или иной форме. Я не считаю это хорошим подходом, если только ваш код OSGi не является неким сервисом многократного использования, который могут использовать другие удаленные клиенты.

Если в том же процессе я скажу, что вам нужно прикусить пулю и сказать, что это будет приложение OSGi. Количество усилий, чтобы взять существующее приложение и запустить его в OSGi, не должно быть чрезмерным.

Предположим, вы рассматривали существующее приложение как один огромный пакет OSGi? Будет некоторая работа по инициализации, но все ли будет «просто работать»? Если вы сделаете это в качестве первого шага, то реальная ре-архитектура и модульность существующего приложения будут отложены. Затем вы просто выставляете интерфейсы, необходимые вашим новым модулям, и, где необходимо, используете сервисы, предоставляемые новыми модулями. Вы сразу получаете преимущества OSGi, структурируя зависимости.

0 голосов
/ 04 мая 2010

Сборка приложения с OSGi может взаимодействовать так же, как и два обычных (Java) приложения. Итак, путем загрузки / сохранения файлов. Или когда один из них создан как http-сервер OSGi, просто обменивайтесь данными через http с этим сервером (OSGi). Просто подумайте об этом, как раньше, без OSGi.

...