Программно запустить OSGi (Equinox)?

Я хотел бы иметь возможность легко запускать инфраструктуру OSGi (предпочтительно Equinox) и загружать любые пакеты, перечисленные в моем pom, из файла java main.

Это возможно? Если да, то как?

Похоже, что инструменты pax сделают это, но я не могу найти документацию, указывающую на это. Я знаю, что могу запустить Equinox следующим образом:

BundleContext context = EclipseStarter.startup( ( new String[] { "-console" } ), null );

Но я хотел бы сделать больше, как я уже сказал: загрузить больше пакетов, может быть, запустить какие-то сервисы и т. д.


person javamonkey79    schedule 12.01.2011    source источник


Ответы (3)


Любой фреймворк OSGi (R4.1 или новее) можно запустить программно с помощью FrameworkFactory API:

ServiceLoader<FrameworkFactory> ffs = ServiceLoader.load(FrameworkFactory.class);
FrameworkFactory ff = ffs.iterator().next();
Map<String,Object> config = new HashMap<String,Object>();
// add some params to config ...
Framework fwk = ff.newFramework(config);
fwk.start();

Платформа OSGi теперь работает. Поскольку Framework расширяет Bundle, вы можете вызывать getBundleContext и вызывать все обычные методы API для управления пакетами, регистрации служб и т. д. Например.

BundleContext bc = fwk.getBundleContext();
bc.installBundle("file:/path/to/bundle.jar");
bc.registerService(MyService.class.getName(), new MyServiceImpl(), null);
// ...

Наконец, вам нужно просто дождаться завершения работы фреймворка:

fwk.stop();
fwk.waitForStop(0);

Повторим еще раз: этот подход работает для любой среды OSGi, включая Equinox и Felix, просто поместив JAR среды в путь к классам.

person Neil Bartlett    schedule 12.01.2011
comment
Это очень полезно, спасибо. Я изо всех сил пытался запустить и остановить фреймворк (перенаправление System.in не так уж и привлекательно). Единственное, что я возражаю против принятия, это то, что я хотел бы иметь возможность загружать свои пакеты из моего пути к классам maven без необходимости жестко кодировать кучу путей и еще много чего. Опять же, может быть, я слишком многого хочу :) - person javamonkey79; 13.01.2011
comment
Что вы подразумеваете под путем к классам Maven? - person Neil Bartlett; 13.01.2011
comment
На самом деле любые зависимости в моем POM - я бы хотел, чтобы они были обнаружены и установлены. - person javamonkey79; 13.01.2011
comment
Ну, вам нужно получить эту информацию из POM. Это вопрос Мейвена. Предлагает ли Maven API, который вы можете вызвать? Или вы можете просто разобрать XML? Я понятия не имею об этом. РЕДАКТИРОВАТЬ: обработчик URL-адресов maven, на который ссылается KitsuneYMG (см. его комментарий), выглядит многообещающе. Установите это как службу, затем выполните installBundle("mvn://repo/groupId/artifactId"). Имейте в виду, однако, что во время выполнения вам потребуются все транзитивные зависимости, а не только зависимости первого уровня во время сборки. - person Neil Bartlett; 13.01.2011
comment
Как насчет в этом случае... попытка программно установить пакет в равноденствии"> stackoverflow.com/questions/6522285/ - person Boltimuss; 29.06.2011
comment
Можешь ли ты получить тот же пакетный контекст, но без запуска нового экземпляра фреймворка и получения вместо него текущего. - person user2133558; 05.02.2020
comment
@user2133558 user2133558 Пожалуйста, уточните, что вы спрашиваете, я не понял. Вероятно, его следует опубликовать как новый вопрос StackOverflow, а не как комментарий к ответу 9-летней давности. - person Neil Bartlett; 06.02.2020

Тема может немного устарела, но тем не менее...

Pax имеет отличную поддержку URL-адресов maven, у него даже есть обработчик URL-адресов, позволяющий динамически преобразовывать jar, отличные от osgi, в красивые аккуратные пакеты.

http://wiki.ops4j.org/display/paxurl/Mvn+Protocol

    <dependency>
        <groupId>org.ops4j.pax.url</groupId>
        <artifactId>pax-url-wrap</artifactId>
        <version>1.2.5</version>        
    </dependency>
    <dependency>
        <groupId>org.ops4j.pax.url</groupId>
        <artifactId>pax-url-mvn</artifactId>
        <version>1.2.5</version>        
    </dependency>

Тогда команда будет такой:

install -s mvn:groupId:artifactId:version:classifier

Примечание: сценарий «куриное яйцо» — вы должны сначала установить их с помощью обработчика URL-адресов файла: или поместить их в каталог автоматического развертывания.

Все это встроено в дистрибутив Karaf, так что, может быть, взгляните на исходный код лаунчера Karaf?

2-е примечание: развертывание моментальных снимков включается путем добавления @snapshots к URL-адресу репо, конфигурация управляется через ConfigAdmin.

С точки зрения управления всеми вашими зависимостями, определенными POM, взгляните на функции Karaf — есть плагин, который позволяет генерировать XML-файл функций, который затем можно использовать для развертывания всего вашего приложения: http://karaf.apache.org/manual/2.1.99-SNAPSHOT/developers-guide/features-maven-plugin.html

Кроме того, этот XML-артефакт может быть развернут в вашем OBR, поэтому вы можете взять ванильную настройку Felix/Equinox/Karaf, добавить обработчик URL-адресов mvn и настроить с помощью репозитория mvn вашей компании, а затем подготовить все приложение =)

person earcam    schedule 24.03.2011

Изменить: понял, что вы хотите начать изнутри java. Мне стыдно за то, что я не читал достаточно внимательно

Проверьте эту ссылку. http://www.eclipsezone.com/eclipse/forums/t93976.rhtml

По сути

public static void main(String args[]) throws Exception {
  String[] equinoxArgs = {"-console","1234","-noExit"};
  BundleContext context = EclipseStarter.startup(equinoxArgs,null);
  Bundle bundle = context.installBundle(
    "http://www.eclipsezone.com/files/jsig/bundles/HelloWorld.jar");
  bundle.start();
}

Изменить: Мейвен

Похоже, что https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 содержит службу обработчиков URL-адресов OSGi, которая может принимать URL-адреса следующего формата и загружать из них пакеты ( mvn://repo/bundle_path )

person KitsuneYMG    schedule 12.01.2011
comment
У меня уже есть большая часть этого, и я также рассматривал возможность загрузки с URL-адреса http - вы случайно не знаете, как загружать пакеты из maven? - person javamonkey79; 13.01.2011
comment
@ javamonkey79 Я никогда не использовал maven. Но groups.google.com/group/ spring-osgi/web/maven-url-handler?pli=1 выглядит многообещающе - person KitsuneYMG; 13.01.2011
comment
@KitsuneYMG: ссылка в Google не работает. У вас есть другая ссылка, которую я могу использовать? Спасибо за помощь.. - person arsenal; 23.08.2013
comment
@javamonkey79 Извините. Я не следил за этим материалом, так как меня перевели в проекты на других языках. Хотя беглый поиск ничего не дал. - person KitsuneYMG; 23.08.2013