Использование OSGi в настольном автономном приложении - PullRequest
6 голосов
/ 15 декабря 2011

Я пытаюсь написать настольное приложение на основе OSGi.У меня есть Swing JFrame, и я хочу добавить возможности для добавления модулей (других пакетов).Я прошелся по EclipseZone OSGi в руководстве по JSig , но каждое приложение запускается из OSGi Framework (в данном случае, Knopflerfish OSGi Desktop).

Так что мой вопрос: есть ли возможностьзапустить приложение без видимой рамки OSGi?Я знал, что из кода можно изменить свойства пакета, но как изменить свойства фреймворка таким образом?(например, место хранения пакета по умолчанию, действие по умолчанию, когда пакет находится в местоположении и т. д .?)

public class MainFrame extends ServiceTracker implements BundleActivator {

    public MainFrame(BundleContext context, JToolBar toolBar) {
        // select, which services is the bundle tracking
        super(context, JMenu.class.getName(), null);
    }

    @Override
    public void start(BundleContext context) throws Exception {
        //display a JFrame
    }

    @Override
    public void stop(BundleContext context) throws Exception {
        //hide a JFrame
    }

    @Override
    public Object addingService(ServiceReference reference) {
        // Process a Service and return a JMenu
        return new JMenu();
    }

    @Override
    public void removedService(ServiceReference reference, Object service) {
        // remove a JMenu from a JFrame
    }

    public static void main(String[] args) {
        // ????????????????????????????????????????????
        // ????????????????????????????????????????????
    }
}

Я написал класс выше (я опубликовал только эскиз), но понятия не имею,что писать в функции main ().Этот комплект отлично работает в Knopflerfish OSGi Desktop, но я хочу, чтобы он работал без него.

Ответы [ 4 ]

13 голосов
/ 15 декабря 2011

Ваш код в основном в порядке, но похоже, что вы хотите больше контроля над самой средой OSGi.Другими словами, вы хотите знать, как запустить OSGi Framework и запустить свой пакет.Проблема, с которой вы столкнулись в настоящее время, заключается в том, что вы используете чей-то модуль запуска (Knopflerfish), который включает в себя KF GUI Console, и вы используете его для установки и запуска своего пакета.Однако ничего из этого не требуется.

В ответе А.В.Алчева он говорит о начале равноденствия с java -jar org.eclipse.osgi.jar -console.Проблема такого подхода в том, что он дает вам пустой OSGi-фреймворк, поэтому вам придется вводить команды в оболочку OSGi, чтобы установить и запустить свой пакет ... тоже не идеально!

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

В псевдокоде ваше приложение запуска должно выглядеть примерно так:

public static void main() {

    1. get a FrameworkFactory using java.util.ServiceLoader.
    2. create an OSGi framework using the FrameworkFactory
    3. start the OSGi framework
    4. Install your bundle(s).
    5. Start all the bundles you installed.
    6. Wait for the OSGi framework to shutdown.

}

В вашемвопрос, который вы конкретно задаете о настройке места хранения комплекта.Это можно сделать, установив свойство Constants.FRAMEWORK_STORAGE на карте, которое вы передаете в метод FrameworkFactory.newFramework.

1 голос
/ 15 декабря 2011

Eclipse RCP - хороший вариант для написания приложений-клиентов.Он полностью основан на OSGi и предоставляет богатый набор инструментов для программирования пользовательского интерфейса.Eclipse также предоставляет среду разработки для их создания.

После сборки у вас будет автономное приложение, которое, как оказалось, основано на OSGi, но не требует взаимодействия с OSGi для запуска, как я и считаюпытаясь выполнить.

Учебник по Eclipse RCP

1 голос
/ 15 декабря 2011

Если вы хотите использовать компоненты Swing, вам вообще не нужен Knopflerfish OSGi Desktop.Просто скачайте EclipseRT Starter Kit и разместите там свои плагины.

Еще один очень простой способ использования OSGi:

java -jar org.eclipse.osgi.jar -console

С помощью этой команды вы запустили равноденствие и можете установить свои пакетыконсоль.

Вы можете найти очень хороший учебник здесь

В вашем случае просто поместите инициализацию JFrame в метод start ():

@Override
public void start(BundleContext context) throws Exception {
    JFrame jf = new JFrame();
    .....
}
0 голосов
/ 15 декабря 2011

Я не уверен, что именно вы хотите сделать, но если вы ищете модульный способ написания приложений на Swing, взгляните на платформу NetBeans.Базовая система модулей не OSGi, но она может «общаться» с модулями OSGi, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...