(01) Apache Felix 入門 - 01

 1、前言

這篇文章是自己參照  Apache Felix 官網 參考指導手冊上的學習步驟書寫的篇目,算不上原創的內容,權當時自己寫的一些學習筆記,當然其中內容也不是完全參照官網上說的來寫,一些部分按照自己的理解做了些修改,更加便於自己理解,對於文中一些地方讀者覺得不明白或者筆者理解錯誤的地方,歡迎各位讀者指正,互相學習!

2、適合讀者

 本文適合對於Java 一些高級特性比較瞭解,對於項目模塊化熱部署有了解,理解 OSGI【百度百科】是一個什麼規範的讀者閱讀,對於剛學習了 Java 的一些初級讀者,本人就不建議學習這些內容了。

3、Apache Felix 項目介紹

只需要知道這個框架是 OSGI 規範的一個由 Apache 實現的框架就可以了。

4、 環境

因爲此學習筆記的例子來自於官網,代碼都比較簡單、易懂,因此我們直接使用最原始的 Java 編寫方式就可以了。

  • 操作系統:win10
  • 代碼編輯器:一個自己用得順手的文本編輯器即可,比如 Notepad++、Ueditor、Visual Code 之類的
  •  Java 版本:本人用的 1.8+ 的版本,不知道低版本有沒有問題,建議用 1.5+ 的吧(現在至少也1.6+了吧),保證環境變量配置正確。
  • 代碼編譯、打包、發佈方式:cmd
  • Apache Felix【點擊進入下載頁】版本:6.0.0

5、 Felix 目錄介紹

- bin        --> 裏面就一個 felix.jar, 不用說,就是 felix 的啓動文件了。
- bundle     --> felix 啓動之後默認加載模塊的目錄。
- conf       --> 默認裏面就一個 config.properties, 一看就知道是配置文件目錄。
######################## 以下目錄爲新建的學習代碼目錄 #################################
- source     --> 源碼目錄

6、啓動

  1. 進入Felix目錄。
  2. 執行 java -jar ./bin/felix.jar。 

        注意必須使用上面的命令執行,因爲 felix.jar 默認會在當前當前運行目錄的 bundle 文件夾內加載啓動所需的 bundle,config 目錄下的 config.propeties 和 system.properties 裏面加載環境變量,如果將其他目錄作爲啓動根目錄,該目錄下不存在 felix 啓動所需信息,啓動就會有問題,當然這些配置可以在啓動的時候以參數的方式配置,但是還是推薦上面的方式啓動。

      項目啓動起一次啓動的時候回在啓動目錄下創建一個 felix-cache 的目錄,用於存放框架運行過程產生的數據,當然該目錄可以在啓動的時候配置,使用 java -jar ./bin/felix.jar <felix-dir> 即可。

  默認felix-cache的更目錄可以配置在./conf/config.properties 文件中,具體配置爲“felix.cache.rootdir=${user.home}/.felix”,這樣在在我們使用 java -jar ./bin/felix.jar 啓動 felix 的時候,會在當前用戶目錄下啓動一個.felix 文件夾, 並且以.felix文件夾作爲 felix-cache 目錄的根路徑,框架在啓動的時候會讀取名稱爲 user.home 的系統屬性替換 ${user.home} 的位置。

 7、執行效果

g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (3.0.0)
    1|Active     |    1|Apache Felix Bundle Repository (1.6.2)
    2|Active     |    1|Apache Felix Gogo Command (0.6.0)
    3|Active     |    1|Apache Felix Gogo Runtime (0.6.0)
    4|Active     |    1|Apache Felix Gogo Shell (0.6.0)

8、Framwork Shell(框架Shell)

        在講解下面的內容之前,首先讓我們來明確一個概念,什麼是 shell【百度百科】! 和 Felix 框架交互的主要方式是使用 Apache Felix Gogo Shell,當框架啓動之後,使用 helo 命令可以查看所有可以使用的命令,使用 help <command-name> 可以查看指定命令的幫助信息。     

小貼士:  

        在 Gogo 中,命令的名稱由兩部分組成--<scope>:<name>。類似於Java 使用全類名的方式避免命名衝突,如果再所有的命令中 <name> 部分是唯一的,可以直接使用 <name> 部分作爲命令輸入執行,如 help, 否則,則必須使用 <scope>:<name> 的方式輸入命令執行。      

使用 felix:install 命令可以安裝 bundle, 至於詳細的說明會在下一章中介紹。我們可以使用 felix:lb 查看當前系統安裝的所有 bundle 信息, 可以使用 stop 0 停止系統核心 bundle,框架也會相應的關閉,任何已經被安裝的 bundle 在框架啓動的使用都會被重新加載(同時也會被啓動)。

bundle 是 OSGI 框架中的組件,bundle 是一個簡單的 Jar 包,其中包含了 MANIFEST.MF 文件和一些其他的文件: class 文件、嵌入式的 jar 文件、原生代碼、資源文件組成。一個 bundle 可能提供一些供用戶使用的方法,也可能是實現特定的服務以供其他的 bunlde 使用;bundle 只有導出的服務和包才能夠被其他 bundle 使用。        

Felix 主要由三個 bundle 組成,位置在 ./bundle 目錄下,這三個 bundle 包括: Gogo Runtime(提供核心命令處理支持的功能),Gogo Shell(提供基於文本的Shell和用戶交互),Gogo Command(提供基礎的設置命令),另外還有 Bundle Repository(爲Bundle提供倉庫服務,類似於 Maven 倉庫的概念),Bundle Repository 使訪問其他 Bundle 變得非常容易,Bundle Repository 可以使用 obr:* 範圍內的命令使用,具體使用方式可以在 Apache Felix OSGi Bundle Repository 找到更多幫助信息。

在安裝 bundle 之前,我們需要重點學習如何將一個 bundle 安裝到 felix 中!安裝主要分爲兩個步驟,第一是安裝、第二是運行,我們可以使用 felix:install 命令安裝 bundle,假設我們需要安裝的 bundle 名稱爲 bundle.jar,位置爲 /path/to/bundle/bundle.jar, 則安裝命令如下:

felix:install file:/path/to/bundle/bundle.jar

當 bundle 安裝成功之後,使用 felix:start  <bundle-ID> 命令啓動安裝好的 bundle,那我們應該如何獲取到安裝好的 bundle 的 <bundle-ID> 呢?答案就是使用 felix:lb 命令查看所有已經安裝好的 bundle,如下:

g! install file:/path/to/bundle/bundle.jar
g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (3.0.0)
    1|Active     |    1|Apache Felix Bundle Repository (1.6.2)
    2|Active     |    1|Apache Felix Gogo Command (0.6.0)
    3|Active     |    1|Apache Felix Gogo Runtime (0.6.0)
    4|Active     |    1|Apache Felix Gogo Shell (0.6.0)
    5|Installed  |    1|Example Bundle (1.0.0)
g! start 5
Hello from Bundle 5.
g!

從上面可以看出,我們剛安裝好的名字爲 bundle.jar 的 bundle,其 bundle-ID 爲 5,我們使用 start 5 (別忘了 felix:start 可以是使用 start 命令簡介表示哦)命令啓動 bundle,下面輸出的 Hello from Bundle 5 是 bundle 在啓動的時候輸出的信息。

bundle 啓動之後,我們可以使用 felix:stop <bundle-ID> 命令停止該 bundle 的運行,使用 felix:uninstall <bundle-ID> 命令卸載安裝的 bundle。另外 bundle 的“安裝”和“啓動”兩個步驟我們可以通過 felix:start <bundle-URL> 的方式一步到位,例如上述名稱爲 bundle.jar 的 bundle 的安裝我們可以使用如下的命令安裝、啓動:

felix:start file:/path/to/bundle/bundle.jar

我們可以使用 felix:update <bundle-ID> 的方式重新加載某個 bundle,注意:felix:update 和 felix:uninstall 命令被執行之後都會立即生效,但是被更新或者卸載的 bundle 導出的接口如果被其他 bundle 引用,則其他接口依然有效,這些引用將會一直存在,直至框架停止或者使用 PackageService 服務刷新,看上去比較麻煩,於是 Felix 框架爲我們提供了簡單的方式實現前述的功能,即 refresh 命令,這樣的實現在 OSGI 規範中是有據可循的。

9、通過網絡遠程安裝 bundle

這部分看懂了文檔,不知道如何操作,這裏就不寫了,大家可以參考 官方指導

10、自動加載 bundle 目錄配置

如果我們希望修改框架啓動默認加載 bundle 的位置,我們可以使用如下的方式配置

java -jar ./bin/felix.jar -b /path/to/dir

更多細節參考 官方指導

11、配置 Felix 框架

Felix 框架的整個生命週期中的默認行爲都可以通過配置文件的方式修改,默認的配置文件位置爲 conf/config.properties 文件,該文件支持 Java 標準的配置文件格式。

Felix 框架運行過程中,系統屬性可以通過 conf/system.properties 文件配置,此種配置系統屬性的方式可以簡化我們對於框架運行過程中屬性的修改。雖然系統屬性對於框架本身並無影響,但是框架啓動程序在啓動框架的時候會將 conf/system.properties 配置文件下所有的屬性讀取到系統配置映射中。

在框架啓動的過程時,可以通過配置 felix.config.properties 和 felix.system.properties 兩個屬性修改 config.properties 和 system.properties 兩個配置文件的默認目錄,如下:

java -Dfelix.config.properties=file:/home/rickhall/config.properties -jar bin/felix.jar

在運行過程中我們都可以在 bundle 中使用 context.getProperty("key") 獲取配置或者系統屬性信息,如果系統屬性和配置屬性中出現了兩個同名屬性,則配置屬性值會覆蓋系統屬性中的同名屬性值,更多配置屬性的信息可以在  Apache Felix Framework Configuration Properties 中找到詳細幫助信息,Felix 框架默認存在 conf/config.properties 文件。

在 config.propeties 中配置的的屬性值可以使用 ${<property>}/foo 的方式,<property> 表示系統配置中的信息,啓動程序在解析的時候會自動將 <property> 解析爲系統配置文件中該鍵對應的值。

更多詳情請參考 官方指導

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章