簡體   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