2011-01-12 2 views
21

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

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

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

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

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

ответ

45

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

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 framework, включая Equinox и Felix, просто помещая фреймворк JAR в путь к классам.

+0

Это очень полезно, спасибо. Я боролся с тем, как начать и остановить рамки (перенаправление System.in не так привлекательно). Мое единственное удержание при принятии заключается в том, что я хотел бы иметь возможность загружать мои пакеты из моего пути к maven без необходимости жесткого кодирования пучков путей и еще чего-то. Опять же, я могу желать слишком много :) – javamonkey79

+0

Что вы подразумеваете под Maven classpath? –

+0

Действительно любые зависимости в моей POM - я бы хотел, чтобы они были обнаружены и установлены. – javamonkey79

2

Edit: Понял вас хотел начать изнутри 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(); 
} 

Edit: Maven

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

+0

У меня уже есть большая часть этого, и я подумал о загрузке с http-url - вы знаете, как загружать пакеты из maven? – javamonkey79

+0

@ javamonkey79 Я никогда не использовал maven. Но https://groups.google.com/group/spring-osgi/web/maven-url-handler?pli=1 выглядит перспективным – KitsuneYMG

+0

@KitsuneYMG: ссылка Google сломана. У вас есть какая-либо другая ссылка, которую я можешь использовать? Спасибо за помощь. – ferhan

5

Этот поток может быть немного устаревшим, но все равно ...

Pax имеет отличную поддержку Maven URLs, он даже не имеет обработчик обертка URL-адрес, позволяющий динамически преобразовывать без 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-адрес или поместить их в autodeploy каталог.

У 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 артефакт может быть развернут на ваши ОБРЫ, так что вы можете взять ваниль установки Felix/Equinox/Karaf, добавить обработчик URL mvn и настройте с помощью mvn repo вашей компании, затем предоставите все приложение =)

Смежные вопросы