我们正在从给定文件夹中加载 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();
也许是错误的方式,或者我错过了什么。你有想法吗?提前谢谢。
答案 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并安装它。
也许是一个穷人的解决方案,但它确实起到了作用。