OSGI小記
前幾個人因為項目中考慮使用OSGI來開發(fā),因此和同事調研了大概1個多月,當時沒做記錄,現(xiàn)在來彌補下OSIG,一個構件模塊化,動態(tài)化系統(tǒng)的標準,眾多應用服務器實現(xiàn)微核采用的技術,如weblogic,glassfish,最出名的是equinox,eclipse核心。
在OSGI環(huán)境中,體現(xiàn)模塊化,動態(tài)化,
模塊化:模塊之間獨立,部首其他模塊影響。
其他模塊只能訪問該模塊對外提供的服務
模塊具備獨立的生命周期,如啟動,停止,更新
動態(tài)化:
對于模塊的增加,修改,刪除,不需要做 額外的處理。
OSGI中,每個模塊就是在物理上就是一個bundle,一個JAR包,是OSGI部署的最小單位,需要在每個JAR包的MANIFEST.MF中給這個bundle標識,象bundle-name,Bundle-SymbolicName,Bundle-ClassPath,Bundle-Activator;
OSGI中bundle的隔離是通過java ClassLoader隔離性來完成的,JAVA中每個classloader空間都是隔離的,默認的classloader有bootStrap ClassLoader(jre/lib,jre/classes) extension classloader(jre/lib/ext),system classloader(-classpath),一般osgi框架還實現(xiàn)自己的應用類加載器。
bundle隔離機制實現(xiàn):每個bundle都有一個獨立的classloader,通過bundle-classpath指定JAR路徑
java中通過雙親委托來加載類,尋找類首先是從parent classloader中尋找,如果找不到才在當前的clasloader中尋找
bundle類加載過程:
java.*開頭的類委派給parent classloader加載;
bootdelegationcan參數(shù)中配置的也委派給parent classloader加載,parent classloader找不到則繼續(xù)下面的操作;
是否在import-Package中,在則委派給導出他的bundle的classloader 加載,不在則繼續(xù)下面
是否在require-bundle中,在則委派給相應的bundleloader加載,不在繼續(xù)下面的
是否在自己的bundle-classpath 中,不在則繼續(xù)下面的
是否在fragmentsbundle的classpath中尋找,不在則繼續(xù)下面的( 在 OSGi 框架中提供了一種稱為 fragment 的特殊 bundle。在裝載的過程中,這類 fragment 是被附加到被稱為“宿主”的 bundle 上,最后作為一個整體 bundle 運行于 OSGi 環(huán)境中。最為典型的 fragment 應用場景是多語言包發(fā)布,將包含多語言包的 bundle 作為主體程序 bundle 的 fragment,這樣可以將多語言包和主體 bundle 作為兩個獨立的部分來發(fā)布,但在運行時它們又是一個整體。)
是否在export-package中,不在繼續(xù)下面的
是否在dynamicimport-package中,在則加載,不在則拋classNotfoundexception
通過MANIFEST.MF定義import-package等,當要注意,最好定義包的版本 如:Import-Package: org.eclipse.osgi.framework.console;version="1.0.0",
org.osgi.framework;version="1.3.0"
Import-Package尋找機制:
resolved的優(yōu)先未resolved
版本高的優(yōu)先版本低的,如果版本一樣,則比較bundle id,小的優(yōu)先,也就是先安裝的bundle優(yōu)先
posted on 2010-10-26 17:28 羔羊 閱讀(931) 評論(0) 編輯 收藏 所屬分類: osgi