如何使用 Apache Felix 过滤插件文件夹中的 OSGi 包

How to filter OSGi Bundles in Plugin folder with Apache Felix

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

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

我检查了 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();

可能走错了,或者我漏掉了什么。你有想法吗?提前致谢。

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

尽管如此你还是要小心,因为文件安装包也会带来这个包。

所以更安全的方法是在一个包中实现侦听器并安装这个包。

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

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

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

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

也许是一个糟糕的解决方案,但它完成了工作。