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

时间:2016-02-16 14:42:25

标签: java osgi apache-felix osgi-bundle

我们正在从给定文件夹中加载 Apache Felix 及其子项目 Apache File Install 的OSGi Bundles。在我们的例子中,在这个文件夹中可能是一个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();

也许是错误的方式,或者我错过了什么。你有想法吗?提前谢谢。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我认为问题在于您尝试从OSGi框架外部注册侦听器。只有将包org.apache.felix.fileinstall导出为系统包导出时,才能执行此操作。

尽管如此,你必须要小心,因为fileinstall包也会带来这个包。

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

答案 2 :(得分:0)

我认为当前的fileinstall实现无法实现:

fileinstall采用第一个可以处理工件的ArtifactListener,而且我没有看到任何"有序属性"。如果jar是一个有效的bundle(关于他的清单,而不是他的要求的可解决性),BundleTransformer返回true。如果此侦听器在您自己的侦听器之前注册,则永远不会调用您的侦听器。

答案 3 :(得分:0)

我目前正在使用监控目录的java WatchService,如果有什么东西被添加到目录中我检查jar,如果一切正常,我将jar移动到fileinstall hotdeploy目录。 Fileinstall看到jar并安装它。

也许是一个穷人的解决方案,但它确实起到了作用。