Программно запустить OSGi (Equinox)? - PullRequest
25 голосов
/ 12 января 2011

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

Возможно ли это?Если да, то как?

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

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

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

Ответы [ 3 ]

51 голосов
/ 12 января 2011

Любая платформа 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);
// ...

Наконец, вам следует просто подождать средуto shutdown:

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

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

5 голосов
/ 24 марта 2011

Эта тема может быть немного устаревшей, но в любом случае ...

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

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

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

У Карафа все это встроено в дистрибутив, так что, может быть, посмотрите на источник запуска Карафа?

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 вашей компании, а затем подготовить все приложение =)

3 голосов
/ 12 января 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();
}

Редактировать: Maven

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

...