3

我有兴趣将 OSGI 容器添加到我的 WAR 中,但我找不到有关如何执行此操作的教程或文档。我发现了一些根本没用的东西。我对 Felix 实现和 Atlassian 实现感兴趣。

我愿意这样做,以便我的 war 接受插件,并且我可以动态扩展我的 Web 应用程序并将其部署到任何 Web 服务器。

任何指向文档或其他内容的链接?任何帮助表示赞赏。

4

3 回答 3

6

将 OSGi 框架启动器添加到 Web 应用程序并不是什么大问题。

您需要添加一个侦听器以在 web.xml 中启动框架启动器

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

启动监听器可能看起来像这样

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>

或者

    <dependency>
        <groupId>org.eclipse.osgi</groupId>
        <artifactId>org.eclipse.osgi</artifactId>
    </dependency>
于 2014-04-01T12:26:03.447 回答
1

我可以看到这是一篇旧文章,但也许​​它对某人有用:这篇文章包含了这个主题的很多有用的东西,至少对我来说这是一个很大的帮助。值得看看该页面上的其他帖子。

于 2015-05-06T12:59:28.313 回答
0

如果您使用 WebLogic 来托管您的应用程序,您可以将 OSGi 包嵌入到您的 WAR 中,并将它们部署到系统定义的 OSGi 服务器。这很好,因为来自 OSGi 日志服务的日志消息可以自动在 WebLogic 日志中看到。此外,当您取消部署应用程序时,您的包将从目标 OSGi 服务器中删除。

有关更多信息,请参阅配置 OSGi 容器开发 OSGi 应用程序或此博客文章

于 2014-04-02T11:15:22.327 回答