日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

karaf内嵌文件服务器,关于OSGI(Karaf) Classloader的几点说明

發布時間:2024/9/27 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 karaf内嵌文件服务器,关于OSGI(Karaf) Classloader的几点说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. Java ClassLoader

Java通過Classloader加載Class,Classloader之間相互隔離。隔離真正的意思是:不同的Classloader可以加載相同的class定義,并且被jvm認定為不同的class。很多人對隔離有誤解,認為不同的Classloader之間不能相互訪問,這其實并不準確。可以這么理解:Classloader只是一個普通的Java類,加載的class集合是它的一個成員變量。如果一個Classloader中維護了另一個Classloader的引用,自然可以通過接口調用查找并使用另一個Classloader加載的類,雙親委派使用的正式這種機制。

雙親委派這名字乍一聽好像是說你有父親、母親兩個Classloader,你可以委派他們兩個先去加載class,他們處理不了的你再處理。如果真這么理解就全錯了。首先,他們不是兩個,可能是n個;其次,他們不是你的父母,他們是整個jvm共享的Classloader;第三,他們誰的父母都不是,因為你和他們沒有血緣(別人也沒有),你不是雙親Classloader的子類。

雙親委派的英文為parent delegation,指的是每個Classloader都有一個getParent方法獲取上一級的Classloader。查找類時,先調用parent Classloader查找,如果找不到在用自身的Classloader查找。層級關系如下:

parent delegation

雙親委派實際上只是引用關系,上述bootrasp、extension、application Classloader之間關系均屬此類。再來看另外一張圖:

自定義Classloader

bootrasp、extension、application Classloader在jvm中只有一個實例,多個用戶自定義的Classloader共享此實例,完成公共部分加載。

2. OSGI Classloader

在OSGI中,每一個Bundle有一個單獨的Classloader實例。更具體點,BundleWiringImpl中定義了一個BundleClassLoader,每當加載一個bundle時,框架創建一個BundleClassLoader實例負責該bundle相關class的加載工作。

BundleClassLoader的加載順序如下:

如class在 java.* package中,委托Bootstrap Classloader處理;

如class定義在 OSGi 框架中啟動委托列表(org.osgi.framework.bootdelegation)中,則將加載請求委托給Bootstrap Classloader處理;

如class在 Import-Package 定義的package中,則框架找到導出此package的 Bundle 的 Class Loader,交其處理 。

如class屬于在 Require-Bundle 中定義的 Bundle,則框架找到導出此package的Bundle的ClassLoader,交其處理。

Bundle 搜索自己的類資源 ( 包括 Bundle-Classpath 里面定義的類路徑和屬于 Bundle 的 Fragment 的類資源);

若類在 DynamicImport-Package 中定義,則開始嘗試在運行環境中尋找符合條件的 Bundle 。

Bundle之間隔離,但如果存在import關系又可以委托給相應export的classloader處理。實現上無非是維護了多個import bundle的Classloader,查找時調用其find方法實現。

需要注意的是:查找時優先查找Import-Package、Require-Bundle中的類,隨后才是查找Bundle自己的類。這里又引入另外一個疑問,Embed-Dependency使用問題。

簡單來說,如果一個Bunlde 需要使用protobuf-java.jar,有如下兩種使用方式:

普通的dependency方式使用,如下圖的Component C的使用方式。

Embed-dependency方式使用,如下圖的ComponentA、ComponentB,此時將protobuf-java做為Bundle自身的一部分使用。

embed-dependency

按類加載的順序,如果先加載Import-Package隨后加載自身的Class,在外部存在protobuf-java,又有內嵌的protobuf-java時,如何做到使用自己的而非外部的呢?答案是在Embed-dependency中的jar并不會出現在Import-Package中。

最后再來講一下,為什么每個bundle需要分配單獨的Classloader,解決什么問題。在我看來,最主要的原因有如下兩個:

定制導出類。非osgi環境下,所有package中的java類都將被導出,無法限定哪些只能jar內使用,哪些是需要export出去的。存在各種誤用,耦合使用情況。

多版本控制。非osgi環境下,一個jvm對于一個類只允許存在一個版本。osgi中每個bundle是獨立開發演進的,可能出現同時存在多個版本。

3. 參考資料

總結

以上是生活随笔為你收集整理的karaf内嵌文件服务器,关于OSGI(Karaf) Classloader的几点说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久久久久久一区探花 | 欧美日韩四区 | 日本福利一区 | 理论片一级 | 热久久精品免费视频 | 天堂中文字幕免费一区 | 久久久亚洲欧洲 | 曰本不卡视频 | 无码精品一区二区三区在线播放 | 精产国品一二三产区m553麻豆 | 岛国成人在线 | 欧美精品久久久久久久久久 | 韩国一区二区三区四区 | 国产精品久久久久久妇女 | 色午夜av| 亚洲福利电影 | 欧美群妇大交群 | 日本少妇xxxxxx | 熟妇人妻av无码一区二区三区 | 三年中国片在线高清观看 | 超碰夜夜| 庆余年三 | av一区二区免费 | 国产一区二区三区免费在线观看 | 国产精品欧美久久久久久 | 中文字幕免费一区二区 | 禁断介护av一区二区 | 熟妇高潮一区二区三区在线播放 | 国产农村妇女毛片精品久久麻豆 | 国产一区黄 | 激情宗合网 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 99久久久国产精品无码网爆 | 亚洲一区二区三 | 亚洲无人区码一码二码三码 | 亚洲一级黄色大片 | 久久精品国产亚洲AV熟女 | 国产精品香蕉 | 国产伦理片在线观看 | 五月婷婷小说 | 精人妻一区二区三区 | www青青草| youjizz.com在线观看 | 欧美性猛交xx乱大交 | 日韩高清一区二区 | 成年人免费观看视频网站 | 日本高清xxx | xxxx69国产| 日韩精品人妻中文字幕有码 | 人妖粗暴刺激videos呻吟 | 麻豆视频成人 | 青青草视频在线观看免费 | 国产免费内射又粗又爽密桃视频 | 亚洲天堂免费av | 琪琪色av | 国产高清免费av | 精品国产一区二区三区四 | 男操女视频网站 | 少妇3p视频 | 无码人妻aⅴ一区二区三区玉蒲团 | 国产日韩中文 | 在线观看涩涩 | 韩国一区二区三区在线观看 | 男人添女人荫蒂国产 | 色婷婷丁香 | 男女搞黄网站 | av在线激情 | 日韩视频免费 | 神马电影久久 | 中字幕视频在线永久在线观看免费 | 亚洲偷偷 | 国产亚洲黄色片 | 国产亚洲精久久久久久无码苍井空 | 免费古装一级淫片潘金莲 | 黄色网页观看 | 国产精品网友自拍 | 91免费在线视频观看 | 四虎网站在线观看 | 特大黑人巨交吊性xxxxhd | 久久精视频 | 少妇久久久久久 | 中文字幕在线播放日韩 | 驯服少爷漫画免费观看下拉式漫画 | 成人在线免费视频 | 国产精品自拍亚洲 | 性视频播放免费视频 | 美女扒开腿让人桶爽原神 | 打白嫩屁屁网站视频短裙 | 日本中文字幕久久 | 男女做网站| 手机福利在线 | 国产黄a三级三级三级看三级男男 | 国模少妇一区二区 | 国产传媒第一页 | 久草精品在线观看 | www.色就是色.com | 捆绑束缚调教 | 亚洲在线免费 | 爱搞逼综合网 |