![](/img/trans.png)
[英]How to implement AOP for someone else's bundles in OSGI (Apache Felix)?
[英]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.