首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

OSGi 依賴管理:Bundle 可視域與套件導入導出機制詳解

     編輯:J2EE

本文為《你好,OSGi》系列第三部分。前文介紹 OSGi 基礎與 Bundle 使用,本篇闡述依賴管理核心:Bundle 可視域概念。

Bundle 可視域原理

OSGi 允許將應用拆分多模組並管理相依性。Bundle 內類別預設僅對內部可見,對外不可見;內部遵循 Java 一般規範。欲從一 Bundle 存取另一 Bundle 類別,須將來源 Bundle 套件導出,再導入目標 Bundle。

4.1 導出 Java 套件

建立 com.javaworld.sample.HelloService Bundle 導出套件:

  1. 建立 Bundle(參照 HelloWorld 步驟)
  2. 新增 com.javaworld.sample.service.HelloService 介面(代碼清單 3)
  3. 新增實作 HelloServiceImpl(代碼清單 4)
  4. Manifest 編輯器 Runtime 標籤 Exported Packages 添加 com.javaworld.sample.service(代碼清單 5)
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloService Plug-in
Bundle-SymbolicName: com.javaworld.sample.HelloService
Bundle-Version: 1.0.0
Bundle-Vendor: JavaWORLD
Bundle-Localization: plugin
Export-Package: com.javaworld.sample.service
Import-Package: org.osgi.framework;version="1.3.0"

關鍵:Export-Package 告知容器外部可存取該套件類別。示範僅導出介面 HelloService,隱藏實作 HelloServiceImpl(內部類)。

4.2 導入 Java 套件

將導出套件導入 HelloWorld Bundle:

  1. Manifest 編輯器 Dependencies 標籤 Imported Packages 添加 com.javaworld.sample.service(代碼清單 6)
Import-Package: com.javaworld.sample.service,
org.osgi.framework;version="1.3.0"

Import-Package 為逗號分隔套件清單。org.osgi.framework 含 OSGi 框架類別(如 BundleContext、BundleActivator)。

  1. Eclipse 編輯器開啟 Activator.java 可見現可存取 HelloService 介面,但不可見 HelloServiceImpl 實作類

4.3 類別層級可視域與類載入器隔離

編譯期可存取 HelloServiceImpl,但在 OSGi 容器運行拋出異常。容器如何隱藏 JAR 內部分類別?

OSGi 容器為每個 Bundle 建立獨立類載入器,管理類別可見性。每個 Bundle 可存取:

  • Java 啟動類路徑下 java.* 開頭套件
  • OSGi 框架類路徑(獨立類載入器載入實作與關鍵介面)
  • Bundle 空間類別(自有 JAR 及附加 JAR)
  • 導入套件類別(如 HelloWorld 導入 com.javaworld.sample.service)

Bundle 級可視域為 OSGi 強大功能:可安全更新 HelloServiceImpl 無須擔心依賴代碼受損。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved