簡體   English   中英

在osgi包中動態加載類

[英]dynamically loading class in osgi bundle

我有OSGI捆綁包(例如A),它依賴於Non-osgi庫(說B)。 B使用Class.forName加載類之一(庫A中的ClassA是庫B中的ClassB類型)。 我包裝了庫B並將其與osgi捆綁在一起,並導入了庫A中所需的軟件包,但是我無法使用Class.forName加載該類。 請注意,庫B是第三方庫,對此我沒有任何控制權。

這是庫B的清單文件,我將其制成啟用OSGI的庫-

清單版本:1.0
上次修改時間:1420745798993
Build-Jdk:1.6.0_51
內置:xyz
Bundle-ManifestVersion:2
捆綁名稱:dapclient
Bundle-SymbolicName:dapclient
捆綁銷售商:dapclient
捆綁版本:1.0.0。
創建者:Apache Maven捆綁插件
DynamicImport-Package:com.xxx.zzz.wi.shared.datacache.model
導出包:com.xxx.platform.yyy.persistence.parser.entity; versio n =“ 2.0.2.8”,com.intuit.xxx.yyy.persistence.utils; version =“ 2.0.2.8”,com.xxx .platform.yyy.persistence.parser.domain; version =“ 2.0.2.8”,co m.xxx.platform.yyy.persistence; version =“ 2.0.2.8”,com.xxx.platform .yyy.persistence.types;版本=“ 2.0.2.8”,com.xxx.platform.yyy.persis tence.annotations; version =“ 2.0.2.8”,com.xxx.platform.yyy.persistence .parser; version =“ 2.0.2.8”
工具:Bnd-2.1.0.20130426-122213

在此庫中,我們使用ClasspathHelper.forPackage(packageName)加載此程序包,其中packageName為“ com.xxx.zzz.wi.shared.datacache.model”。 從反射庫使用ClasspatheHelper。

classForName使用“當前類的定義類加載器”,因此您可能必須將包導入到A和B中才能完成此工作。 因此,通常,ClassA必須在單獨的捆綁軟件中。 但是,如果您與lib緊密相連,則最好在'B'int Bundle A中嵌入'B'int BundleA。

除此之外,您可以向B的創建者開票,以允許進行更通用的類加載,例如提供類本身而不是字符串,支持某種類型的解析器掛鈎或至少使用上下文類加載,在這種情況下,您可以使用類似

Thread thread = Thread.currentThread();
ClassLoader oldLoader = thread.getContextClassLoader();
try {
    thread.setContextClassLoader(getClass().getClassLoader());
    //call lib here that supports context-class-loading
} finally {
    thread.setContextClassLoader(oldLoader);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM