簡體   English   中英

系統包如何訪問系統包?

[英]how does system bundle has access to system packages?

我正在探索過去幾周如何實施OSGI。 我知道每個bundle都使用自己的類加載器來加載它的類。 作為我調查的一部分,我理解每個bundle的類加載器的父級是null,即引導類加載器。

System.out.println("ClassInBundle class is loaded by "+ClassInBundle.class.getClassLoader());
System.out.println("ClassInBundle parent class is "+ClassInBundle.class.getClassLoader().getParent());

bundle samplebundle中上面代碼的輸出是

ClassInBundle class is loaded by com.sample.bundle.samplebundle [34]
ClassInBundle parent class is null

對於bundle中的導入,它維護一個packagename => classloader的映射,以便它可以將請求委托給正確的類加載器

Bundle SB = felix.getBundleContext().getBundle(0);
List<BundleWire> sbwires=SB.adapt(BundleWiring.class).getRequiredWires(null);
List<BundleWire> li=bundle.adapt(BundleWiring.class).getRequiredWires(null);
for(BundleWire i : li){
    System.out.println(i);
}

上面代碼的輸出是

[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (osgi.wiring.package=com.test.packag) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.8.0)(!(version>=2.0.0))) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework.wiring)(version>=1.2.0)(!(version>=2.0.0))) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.ee; (&(osgi.ee=JavaSE)(version=1.6)) -> [org.apache.felix.framework [0](R 0)]

正如您在上面輸出的第一行中所看到的,包com.test.packag被添加為FelixConstants.FRAMEWORK_SYSTEMPACKAGES ,並且bundle samplebundle被連接到com.test.packag的 系統包[0]

所以,我想了解system bundle [0]如何訪問由不同類加載器(App類加載器)加載的系統包。 不僅像Bundle,BundleActivator,Felix這樣的OSGI的所有核心類也都由App類加載器加載。 因此,我嘗試調試Felix代碼以了解系統包是否將loadClass()請求委托給App類加載器。 不幸的是,在調試我觀察到BundleWiringImpl類的m_wiring變量時,我注意到系統bundle的類加載器是null (這是不可能的,因為引導類加載器只加載java。*包)。

如果我錯了,請糾正我的理解。

我的問題是

system_bundle [0]的類加載器是什么,它的父類加載器是什么?

如果system_bundle類加載器的父級不是App類加載器,系統包是否還維護package => classloader的映射來加載由app類加載器加載的類?

類加載器的層次結構究竟是什么(bundle類加載器,系統類加載器,引導類加載器和app類加載器)?

謝謝。

通常,OSGi框架(也稱為系統軟件包)由應用程序加載器加載,因此可以看到應用程序加載器及其父級的所有其他內容,即擴展加載程序和引導加載程序。

這實際上取決於你如何寫你的發射器。 您可以嵌入到OSGi的任何標准的Java應用程序只是通過實例化一個FrameworkFactory ,並用它來推出一個Framework 執行此操作時,OSGi框架只是類路徑上的另一個庫,它可以看到與您自己的代碼相同的類集。

你可以根據自己的喜好制作簡單或花哨的東西。 例如,您可以將OSGi Framework嵌入到J2EE應用程序服務器中部署的Servlet中......在這種情況下,系統包將可以看到Web應用程序中可用的所有類型,這由WEB-INF的內容控制。 您甚至可以將OSGi框架嵌入到部署到另一個OSGi框架的軟件包中...... OSGi開始了!

在所有這些情況下,框架可以選擇要導出的包集合。 這些包可以由該Framework內的bundle導入。 默認情況下,導出的包是相關JavaSE版本的標准JavaSE包集合,但您可以使用其他應用程序級包進行擴充。

暫無
暫無

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

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