【问题标题】:How to filter OSGi Bundles in Plugin folder with Apache Felix如何使用 Apache Felix 过滤插件文件夹中的 OSGi 包
【发布时间】:2016-02-16 14:42:25
【问题描述】:

我们正在从给定文件夹加载带有 Apache Felix 及其子项目 Apache File Install 的 OSGi 包。在我们的例子中,这个文件夹中可能会包含带有 Import-Package 的捆绑包,它不在容器的类路径中。这会导致错误日志消息(每 2 秒)。 (没关系,不应该加载捆绑包)。

我的问题是:是否有可能在安装包之前对其进行过滤?

我检查了org.apache.felix.fileinstall.internal.DirectoryWatcher 的实现,发现我可能想要一个org.apache.felix.fileinstall.ArtifactListener

final ArtifactListener myListener = new ArtifactListener() {
    @Override
    public boolean canHandle(final File artifact) {
        return bundleFullfillsPrecoditions(artifact);
    }
};

不幸的是,我无法正确注册该侦听器(并且从未调用过 canHandle)。我试图将它注册为 BundleContext 上的服务:

//Initialize Felix Framework
org.osgi.framework.launch.Framework osgiFramework = this.createFramework(configuration);
osgiFramework.init();
osgiFramework.start();

//Register Listener?
osgiFramework.getBundleContext().registerService(ArtifactListener.class, myListener, null);

//Start File Install Bundle
org.osgi.framework.Bundle pluginFolderWatcher = osgiFramework.getBundleContext().installBundle(getFolderWatcherJarPath());

pluginFolderWatcher.start();

也许这是错误的方式,或者我错过了一些东西。你有想法吗?提前致谢。

【问题讨论】:

    标签: java osgi apache-felix osgi-bundle


    【解决方案1】:

    唯一真正的答案是:不要将 FileInstall 用于生产用例,而是编写自己的管理代理来执行您真正想要的操作。 安装包并不难...

    【讨论】:

      【解决方案2】:

      我认为问题在于您尝试从 OSGi 框架之外注册侦听器。仅当您将包 org.apache.felix.fileinstall 导出为系统包导出时,这才有效。

      即使你必须小心,因为文件安装包也会带来这个包。

      因此,更安全的方法是在捆绑包中实现侦听器并安装此捆绑包。

      【讨论】:

      • 我明白了,这绝对是个问题,因为 ArtifactListener 是在我的代码(和我的类加载器)中实例化的,因此不是文件安装包所期望的 ArtifactListener。
      • 还有一个问题。 文件安装 不跟踪 ArtifactListener 类型的服务。因此,我需要实现一个依赖于 File Install 并注册一个 ArtifactTransformer. 的 Bundle
      【解决方案3】:

      我认为当前的 fileinstall 实现不可能:

      fileinstall 采用第一个可以处理工件的 ArtifactListener,我没有看到任何“有序属性”。 BundleTransformer 返回true 如果 jar 是一个有效的包(关于他的清单,而不是他的需求的可解决性)。如果这个监听器在你自己的监听器之前注册,那么你的监听器将永远不会被调用。

      【讨论】:

        【解决方案4】:

        我目前正在使用监视目录的 java WatchService,如果将某些内容添加到目录中,我会检查 jar,如果一切正常,我会将 jar 移动到 fileinstall hotdeploy 目录。 Fileinstall 看到 jar 并安装它。

        也许是一个穷人的解决方案,但它确实有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-16
          • 2016-10-13
          • 1970-01-01
          • 2013-03-24
          • 2018-05-14
          • 2014-05-17
          • 2020-07-29
          • 1970-01-01
          相关资源
          最近更新 更多