繁体   English   中英

如何使用Apache Felix过滤Plugin文件夹中的OSGi捆绑软件

[英]How to filter OSGi Bundles in Plugin folder with Apache Felix

我们正在从给定文件夹中使用Apache Felix及其子项目Apache File Install加载OSGi Bundle。 在我们的情况下,可能在此文件夹中包含带有Import-Package ,该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();

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

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

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

即使这样,您也要小心,因为fileinstall捆绑包也会带来此软件包。

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

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

fileinstall使用第一个可以处理工件的ArtifactListener,我没有看到任何“有序属性”。 如果jar是有效的捆绑包,BundleTransformer返回true (就其清单而言,而不是其要求的可解决性)。 如果此侦听器在您自己的侦听器之前注册,那么您的侦听器将永远不会被调用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM