[英]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.