Внедрить OSGI в войну

Я заинтересован в добавлении контейнера OSGI в свою WAR, но я не могу найти учебник или документацию о том, как это сделать. Я нашел некоторые вещи, которые совершенно бесполезны. Меня интересует реализация Felix и реализация Atlassian.

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

Любые ссылки на документацию или что-то в этом роде? Любая помощь приветствуется.


person Alex    schedule 01.04.2014    source источник


Ответы (3)


Добавление средства запуска OSGi Framework в веб-приложение не представляет большой сложности.

Вам нужно добавить прослушиватель, чтобы запустить средство запуска фреймворка в вашем web.xml.

<listener>
  <listener-class>at.badgateway.StartupListener</listener-class>
</listener>

Startuplistener может выглядеть так

public class StartupListener implements ServletContextListener {

//vars

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // set props
    Map<String, String> config = new HashMap<String, String>();
    config.put(Constants.FRAMEWORK_STORAGE, "path to cache");
    config.put(Constants.FRAMEWORK_STORAGE_CLEAN, "true");

        try {
                    // get framework and start it
            FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
            framework = frameworkFactory.newFramework(config);
            framework.start();

                    // start existing bundles
            bundleContext = framework.getBundleContext();
            starter = new MyBundleStarter(servletContext, bundleContext);
            starter.launch();

        } catch (Exception ex)  
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
         // stop framework
    }
}

Позаботьтесь о классе MyBundlestarter в верхней кавычке, это класс, который активирует все пакеты, содержащиеся в вашей войне. (например, /WEB-INF/Osgi-Bundles)

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
public class MyBundleStarter{

    private BundleContext bundleContext = null;

    public void launch() throws Exception {

        ArrayList<Bundle> availableBundles= new ArrayList<Bundle>();
        //get and open available bundles
        for (URL url : getBundlesInWar()) {
            Bundle bundle = bundleContext.installBundle(url.getFile(), url.openStream());
            availableBundles.add(bundle);
        }

        //start the bundles
        for (Bundle bundle : availableBundles) {
            try{
            bundle.start();
            }catch()
        }

    private List<URL> getBundlesInWar() throws Exception {
        // returns a list of URLs located at destination
    }
}

И последнее, но не менее важное: вы должны добавить в свой проект инфраструктуру osgi.

    <dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.apache.felix.framework</artifactId>
    </dependency>

or

    <dependency>
        <groupId>org.eclipse.osgi</groupId>
        <artifactId>org.eclipse.osgi</artifactId>
    </dependency>
person Martin Baumgartner    schedule 01.04.2014
comment
Мартин... можешь дать мне какую-нибудь документацию? некоторые ссылки на реализацию OSGI, которая позволяет вам это сделать? и т.д - person Alex; 01.04.2014
comment
Этот код работает с равноденствием и феликсом. Просто добавьте org.eclipse.osgi или org.apache.felix.framework в свой pom, и он будет обнаружен, потому что там они содержат класс, реализующий FrameworkFactory-Interface. - person Martin Baumgartner; 01.04.2014
comment
Здорово. Я попробую, когда вернусь домой. Спасибо - person Alex; 01.04.2014
comment
Примечание. Может быть полезно добавить файл-установку felix в качестве пакета, что добавляет возможность добавлять пакеты в тестовых средах. - person Martin Baumgartner; 02.04.2014

Я вижу, что это старый пост, но, возможно, он может быть кому-то полезен: этот writing содержит много полезного в этой теме, по крайней мере, для меня это было действительно большим подспорьем. И стоит взглянуть на другие сообщения на этой странице.

person Tamas G.    schedule 06.05.2015

Если вы используете WebLogic для размещения своего приложения, вы можете встроить пакеты OSGi в свой WAR и развернуть их на определенном системой сервере OSGi. Это хорошо, потому что сообщения журнала из службы журнала OSGi можно автоматически увидеть в журналах WebLogic. Также ваши пакеты будут удалены с целевого сервера OSGi, когда вы отмените развертывание своего приложения.

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

person jwells131313    schedule 02.04.2014