1. 程式人生 > >osgi 學習系列(二)第一個plug-in專案

osgi 學習系列(二)第一個plug-in專案

New-->Plug-in Project



如果你的bundle在啟動和關閉的時候需要被通知,可以勾上Options中的第一個,實現BundleActivator介面,Finish後我們的第一個Bundle就建好了

Bundle中最重要的一個檔案就是bundle的描述檔案MANIFEST.MF,看下該檔案中的內容


Bundle-ManifestVersion

    該屬性頭告訴OSGi容器,本Bundle將遵循OSGi規範,數值2表示本Bundle和OSGi規範第4版本相容;如果該屬性的數值為1,那麼則表示本包和OSGi版本3或更早版本相容。

Bundle-Name

    該屬性頭為本Bundle定義了一個簡短的、可以閱讀的名稱;

Bundle-SymbolicName

    這個屬性頭為本Bundle定義了一個唯一的、非本地化的名字;當您需要從別的Bundles中訪問某一指定的Bundle時,您就要使用這個 名字。

Bundle-Version

  該屬性頭給出了本Bundle的版本號。

Bundle-Activator

    該屬性頭給出了本Bundle中使用的監聽器類名字,這個屬性值是可選的。監聽器將對Activator中的start()和stop()方法 監聽。

Bundle-Vendor

該屬性頭是對本Bundle發行商的表述。

Bundle-RequiredExecutionEnvironment

    Bundle執行所依賴的環境

Import-Package

    定義bundle的匯入包。


Dependencies中新增bundle所依賴的bundle或所依賴的包


Runtime中設定該bundle匯出的包

Bundle匯出後其實就是一個jar檔案,這個jar檔案和普通的jar檔案唯一不同的地方就是Meta-inf目錄下的MANIFEST.MF檔案的內容,關於Bundle的所有資訊都在MANIFEST.MF中進行描述,在OSGI框架中對於每個Bundle採用的是獨立的classloader機制,這也就意味著不能採用傳統的如引用其他Bundle的工程來實現Bundle間的協作了,那麼在OSGI框架中Bundle之間是怎麼協作的呢,在OSGI框架中對於每個Bundle可以定義輸出的包以及引用的包,這樣在Bundle間就可以共享包中的類了,儘管這樣也可以直接實現簡單的Bundle的協作,但在OSGI框架中更加推薦的是採用Service的方式,每個Bundle可以通過BundleContext註冊對外提供的服務,同時也可以通過BundleContext來獲得需要引用的服務,採用Service-Oriented的方式可以使得對外提供的服務能夠更加的封閉,不需要為了使用別的Bundle提供的Service而做環境依賴等的設定,同時,Bundle還可以採用Require-Bundle的方式來直接引用其他的Bundle,不過不推薦使用這種方式,耦合度太高。

執行新建的bundle


把需要的bundle勾上,Run



bundle在其生命週期的6種狀態和OSGi控制命令臺的一些常用命令

INSTALLED

Bundle已經成功的安裝了。

RESOLVED

Bundle中所需要的類都已經可用了,RESOLVED狀態表明Bundle已經準備好了用於啟動或者說Bundle已被停止。

STARTING

Bundle正在啟動中,BundleActivator的start方法已經被呼叫,不過還沒返回。

ACTIVE

Bundle已啟動,並在執行中。

STOPPING

Bundle正在停止中,BundleActivator的stop方法已經被呼叫,不過還沒返回。

UNINSTALLED

Bundle已經被解除安裝了。


安裝Bundle

通過BundleContext的installBundle方法來安裝Bundle,在安裝前首先需要對Bundle進行校驗,導致Bundle安裝失敗的原因在之前Module Layer章節中已經描述過了,如校驗通過,OSGI框架中將安裝Bundle到系統中,此時OSGI框架會分配一個高於現在系統中所有的Bundle的ID給新的Bundle,安裝完畢後Bundle的狀態就變為INSTALLED了,同時會返回bundle物件,在Bundle安裝後就要使用bundle物件來管理Bundle的生命週期狀態了。

解析Bundle

Bundle安裝完畢後,OSGI框架將對Bundle進行解析,以檢測Bundle中的類依賴等是否正確,如有錯誤則仍然處於INSTALLED狀態,如成功Bundle的狀態則轉變為RESOLVED。

啟動Bundle

在啟動Bundle前需檢測Bundle的狀態,如Bundle狀態不為RESOLVED,那麼需要先解析Bundle,如啟動一個解析失敗的Bundle,則會丟擲BundleException,但此時Bundle的狀態仍然會被設定為ACTIVE;如Bundle的狀態已經是ACTIVE,那麼啟動Bundle對它不會產生任何影響。

通過BundleContext的getBundle方法可獲取指定Bundle ID的Bundle物件,在獲取到Bundle物件後可使用Bundle物件的start方法來啟動Bundle,此時會呼叫MANIFEST.MF中的Bundle-Activator屬性對應的BundleActivator類的start方法(如存在BundleActivator類),在start方法執行的過程中Bundle的狀態為STARTING,當start方法執行完畢後Bundle的狀態轉變為ACTIVE,如start方法執行失敗,Bundle的狀態轉變為RESOLVED。

BundleActivator類是可以不需要的,建議不要在BundleActivator中初始化過多的東西,這樣會使得系統的啟動速度會變得很慢,同時也會消耗大量的記憶體,而且OSGI對於動態性的良好支援使得儘可以在需要的時候才去獲取所需的資源。

停止Bundle

通過BundleContext的getBundle方法可獲取指定Bundle ID的Bundle物件,在獲取到Bundle物件後可使用Bundle物件的stop方法來啟動Bundle,此時會呼叫MANIFEST.MF中的Bundle-Activator屬性對應的BundleActivator類的stop方法,在stop方法執行的過程中Bundle的狀態為STOPPING,當stop方法執行完畢後Bundle的狀態轉變為RESOLVED,如stop方法執行失敗,Bundle的狀態則繼續保留原狀態。

即使Bundle已經停止,其export的package仍然是可以使用的,這也就意味著可以執行RESOLVED狀態的Bundle中export package的類。

解除安裝Bundle

通過呼叫Bundle物件的uninstall方法可完成Bundle的解除安裝,此時Bundle的狀態轉變為UNINSTALLED。

即使Bundle已解除安裝,其export的package對於已經在使用的Bundle而言仍然是可用的,但對於新增的Bundle則不可使用已解除安裝的Bundle export的package。

Osgi命令控制檯常用命令

ss: 該命令顯示所有已安裝的Bundles及它們的狀態,它將顯示Bundle ID,Bundle狀態,Bundle的簡短名;  

start【bundleid】: 啟動對應id的Bundle 

stop【bundleid】: 停止對應id的Bundle 

update【bundleid】: 更新對應id的Bundle

install【bundleid】: 安裝對應id的Bundle 

uninstall【bundleid】: 解除安裝對應id的Bundle

exit: 退出osgi環境

refresh【bundleid】: 重新整理對應id的Bundle

ls:顯示所有services  如果沒有釋出service會顯示找不到該命令

ls –c 【bundleid】:顯示該bundle中所有釋出service的詳細資訊,對與unsatisfied的component查錯很有用

相關推薦

osgi 學習系列一個plug-in專案

New-->Plug-in Project 如果你的bundle在啟動和關閉的時候需要被通知,可以勾上Options中的第一個,實現BundleActivator介面,Finish後我們的第一個Bundle就建好了 Bundle中最重要的一個檔案就是bundle

Spring Boot 學習筆記一個 Spring boot 程式

  SpringBoot程式建立方式  1、建立一個Spring boot專案      1) 可以採用方式一: 使用 eclipse 的 Spring Tool Suite (STS) 外掛/或者 IDEA 自帶的外掛建立;    

例項學習ansible系列13一個playbook

知識點:ansible使用playbook來管理自動化task。playbook是yaml格式的檔案,其基本內容可以認為是多條ansible的ad-hoc的語句組成。我們在前面嘗試了很多常用module的ad-hoc的寫法,接下來通過一個最簡單的例子來看看使用playbook怎麼用。

Nhibernate學習教程2-- 一個NHibernate程序

collect 單元測試框架 文件映射 deb color rtu etc erb session管理 NHibernate之旅(2):第一個NHibernate程序 本節內容 開始使用NHibernate 1.獲取NHibernate 2.建立數據庫表 3.創建C#類庫

Mybatis學習系列Mapper映射文件

tst 轉換 tin 是個 sql註入 eas 屬性。 object spl Mapper映射文件,作用是用來配置SQL映射語句,根據不同的SQL語句性質,使用不同的標簽,mapper文件中常用的標簽有<iselect>、<insert>、<

eShopOnContainers學習系列:數據庫連接健康檢查

技術分享 負載 star bsp 方法 containe 需要 正常 連接 項目裏使用數據庫的時候,我們有時候需要知道數據庫當前的健康狀態,特別是當數據庫連接不上的時候能夠立馬獲悉。eShopOnContainers裏存在著大量的服務健康、連接健康的檢查,數據庫連接是其中之

Windows Service 學習系列:C# windows服務:安裝、解除安裝、啟動和停止Windows Service

一、通過CMD安裝、解除安裝、啟動、停止Windows Service     方法一   1.以管理員身份執行cmd   2.安裝windows服務       切換cd C:\Windows\Microsoft.NET\Framework\v4.0.30319(InstallUtil.e

Log4net學習系列——Log4net的例項

一、log4net簡單例項建立步驟如下 1、第一步:在專案中新增對log4net.dll的引用,這裡引用版本是2.0.8.0 2、第二步:程式啟動時讀取log4net的配置檔案。   讀取log4net的配置檔案有兩種方式   (1)如果是CS程式,在根目錄的Program.cs中的Main方法中新增

Udacity強化學習系列—— 馬爾科夫決策過程Markov Decision Processes

說到馬爾科夫Markov,大家可能都不陌生,陌生的[連結往裡走](https://baike.baidu.com/item/%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E8

SpringBoot 一個SpringBoot專案——HelloWord

     上一篇文章我們有介紹了SpringBoot的作用以及核心原理,還有介紹了與SpringCloud和SpringMVC的關係,這篇文章我們就開始第一個SpringBoot專案——HelloWord 1.建立專案 File——>New——>Other

IOS 初級開發入門教程一個HelloWorld工程及StoryBoard使用

前言 在IOS開發之路的博文第一章:(IOS開發入門介紹http://blog.csdn.net/csdn_aiyang)我大致系統介紹了有關IOS的一些基礎認識,如果不完全都記住沒關係,以後我們開發之路還很長,慢慢的自然而然就明白是怎麼回事了。這一篇我將手把手教大家完成第

使用IDEA進行Spark開發-一個scala程式

上面一篇文章博主已經給大家演示好了如何去配置一個本機的scala開發環境,現在我們就一起去寫我們的第一個spark開發的scala程式吧! 開啟IDEA,選擇建立一個新的工程檔案。 點選scala,建立一個scala工程 輸入我們程式名稱——word

pyspark學習系列讀取CSV檔案 為RDD或者DataFrame進行資料處理

一、本地csv檔案讀取:最簡單的方法:import pandas as pd lines = pd.read_csv(file) lines_df = sqlContest.createDataFrame(lines)或者採用spark直接讀為RDD 然後在轉換lines =

機器學習系列——迴歸模型

迴歸(Regression)模型是指機器學習方法學到的函式的輸出是連續實數值,迴歸模型可以用於預測或者分類,這篇部落格中主要整理用於預測的線性迴歸模型和多項式迴歸模型。 線性迴歸 按照機器學習建模的三個步驟,首先需要確定選用的模型,這裡就是線性迴歸(Li

正則表示式從零開始學習系列

正則表示式學習 -- 實踐     如何讓一個完全沒接觸過正則表示式的人去快速有效的學會正則表示式?這的確是個很難回答的問題。不過我想最好的方式就是把自己當成這麼一個人,然後把自己的學習過程分享出來,想必是個比較不錯的方式。     現在,我將打算去做這麼一件事,希望對

OSGI學習系列MANIFEST.MF詳解

<一>在osgi專案中META-INF目錄下有一個MANIFEST.MF檔案,是載入bundle時必不可少的,如下圖所示: <二>下面簡單解釋一下其中的幾個元素 #幾個必須的

Shader 學習歷程——一個shader

本系列記錄著本人自學的一個過程,與很多部落格一樣,起著激勵自己不斷學習和記錄日常的作用。 嗯,現在開始。 計算機圖形學中的渲染管線分為固定功能管線和可程式設計渲染管線兩種。 unity中shade

Python django 入門學習系列

1 . 繫結 URL 與檢視函式 2 .使用Django模板系統 這裡主要是跟著追夢的教程自己一邊看著一邊用於實踐來寫的 步驟1:首先在 專案應用的目錄下建立一個 urls.py 檔案 在urls.py 中寫入: blog/urls.p

MongoDB學習系列mongo聚合查詢例項

mongoDB聚合查詢Java程式碼,小例項。 private void init(String year) throws Exception {         if (year == null) {             year = new SimpleDateFo

Docker學習系列:Ubuntu14.04下安裝Docker-2016.06.26更新版

注:docker官網更新很快,而且更新變化很大,3個月前的安裝方法,今天發現已經不再適用,所以,這裡對ubuntu下安裝docker的方法進行更新 Ubutnu上安裝Docker的詳細教程見新版的Docker官網 安裝使用時,需要注意一點:要用sudo許可