java - 从 bundle 部署 bundle

标签 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();
        }

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

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

P.S 你能告诉我如何检查 bundle 是否已成功部署在 Felix 中吗?

最佳答案

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

BundleContext.getBundle(String location);

如果您使用该函数,则不必遍历所有包。

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

要了解安装 bundle 后到底发生了什么,请参阅该函数的 javadoc:http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#installBundle%28java.lang.String,%20java.io.InputStream%29

据我所知,在调用此函数后, bundle 将保持在 INSTALLED 状态(遗憾的是,Javadoc 对我来说并不清楚)。您可以使用以下代码片段强制解析 bundle :

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

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

请注意,即使您解析了某个 bundle ,如果不需要的话,可以连接到新 bundle 的其他 bundle 也不会这样做。例如。如果他们有一个可选的导入包或者他们已经连接到其他包,则不会发生任何事情。要强制重新接线,您应该调用 FrameworkWiring.refreshBundles功能。如果不清楚应将哪些 bundle 作为参数传递,只需使用空参数调用刷新即可。

“我可以从 bundle 成功安装 bundle ,但无法访问依赖项 bundle 导出的包”:

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

在bundle上调用start之后(如果你有一个Fragmentbundle,你不应该调用start,而只能调用refresh),它应该获得ACTIVE状态。如果调用 BundleActivator 期间出现异常或者该包是 Fragment 包,它将保持已解决状态。

关于java - 从 bundle 部署 bundle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20836063/

相关文章:

java - 在已锁定的文件上打开文件输出流会覆盖它

eclipse - Equinox 中的 LogService 和 LogReaderService 如何协同工作?

osgi - XPage Osgi 插件开发

Android 上下文和 OSGi 包

php - Yii2 JS Assets 缩小问题

java - 为什么要使用单独的轮询线程和工作线程?

java - 我可以在 shiro jdbcrealm doGetAuthenticationInfo() 方法中将用户重定向到其他 jsp 页面吗?

java - 有关 Java 数组的帮助 : Saving to output file

Java API的newInstance和OSGi

ruby-on-rails - GemNotFound 在开发中使用时抽取