从捆绑包部署捆绑包

Pet*_*zov 0 java osgi bundle apache-felix osgi-bundle

我想从OSGI包中启动OSGI包.正如您所看到的,此代码通过从目录部署它来启动bundle:

private void installStartBundle(BundleContext bc, String location, String name) throws BundleException
        {
            debug("installing " + location + "...");
            Bundle[] all = bc.getBundles();
            for (Bundle bundle : all)
            {
                String l = bundle.getLocation();
                if (l.indexOf(name) != -1)
                {
                    debug("already installed bundle " + bundle.getBundleId() + "|" + bundle.getLocation() + ">" + bundle.getSymbolicName());
                    return;
                }
            }

            Bundle b = bc.installBundle(location);
            debug("starting " + b.getSymbolicName());
            b.start();
        }
Run Code Online (Sandbox Code Playgroud)

我注意到一个问题:例如,我有一个包含xml配置文件和主包的包,它通过将其部署到Felix并将包访问到xml包中来加载xml配置文件.

我可以从bundle成功安装bundle,但是依赖包的导出包不可访问.也许部署过程太慢,捆绑加载器无法找到导出的包.知道如何解决这个问题吗?

PS你能告诉我如何检查一个捆绑包是否在Felix中成功部署?

Bal*_*dos 5

请注意,BundleContext具有以下功能:

BundleContext.getBundle(String location);
Run Code Online (Sandbox Code Playgroud)

如果使用该功能,则不必遍历所有捆绑包.

请检查OSGi中bundle的生命周期,了解它的安装和启动方式.要获得良好的图片,请访问http://zenit.senecac.on.ca/wiki/index.php/OSGi_Concepts_Bundle_Life-Cycle.

要知道安装捆绑包后到底发生了什么,请参阅功能的javadoc:http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#installBundle%28java.lang.字符串%20java.io.InputStream 29%

我记得很多,在调用这个函数后,bundle会保持在INSTALLED状态(遗憾的是,我不清楚Javadoc).您可以使用以下代码段强制解析捆绑包:

Bundle systemBundle = bundleContext.getBundle(0);
FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class);
frameworkWiring.resolveBundles(Arrays.asList(new Bundle[] {bundle}));
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅resolveBundles函数的javadoc:http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/wiring/FrameworkWiring.html#resolveBundles%28java.util.Collection%29

请注意,即使您解析了捆绑包,其他可以连接到新捆绑包的捆绑包也不会这样做.例如,如果他们有一个可选的import-package,或者他们已经连接到其他bundle,那么什么都不会发生.要强制重新连接,您应该调用FrameworkWiring.refreshBundles函数.如果不清楚,您应该将哪个bundle作为参数传递,只需使用null参数调用refresh.

"我可以从捆绑包中成功安装捆绑包,但依赖包中导出的包不可访问":

我不知道你是如何得出这个结论的.如果您在另一个包中有可选包导入,则可能是您没有强制刷新.

在bundle上调用start之后(如果你有一个Fragment包,你不应该调用start,而只是刷新),它应该得到ACTIVE状态.如果在调用BundleActivator期间出现异常或者bundle是Fragment包,它将保持RESOLVED.