前言
第一部分 走近OSGi
第1章 Java 模組化之路
1.1 什麼是OSGi
1.1.1 OSGi 標準的演進
1.1.2 Java 模組化標準之爭
1.2 為什麼使用OSGi
1.2.1 OSGi 能讓軟體開發變得更容易嗎
1.2.2 OSGi 能讓系統變得更穩定嗎
1.2.3 OSGi 能讓系統執行得更快嗎 1.2.4 OSGi 能支撐企業級開發嗎
1.3 本章小結
第二部分 OSGi 標準與原理
第2章 模組層標準與原理
2.1 OSGi 標準概要
2.2 Bundle
2.3 描述中繼資料
2.3.1 預先定義標記
2.3.2 使用視覺化工具
2.4 Bundle 的組織與依賴
2.4.1 匯出和匯入Package
2.4.2 約束規則與範例
2.4.3 驗證Bundle 有效性
2.5 OSGi 的類別載入架構
2.5.1 父類別載入器
2.5.2 Bundle 類別載入器
2.5.3 其他類別載入器
2.5.4 類別載入順序
2.6 定義執行環境
2.7 當地語系化
2.8 本章小結
第3章 生命週期層標準與原理
3.1 Bundle 標識
3.2 Bundle 狀態及轉換
3.2.1 安裝過程
3.2.2 解析過程
3.2.3 啟動過程
3.2.4 更新過程
3.2.5 停止過程
3.2.6 移除過程
3.3 啟動等級
3.3.1 設定啟動等級
3.3.2 調整活動啟動等級
3.4 事件監聽
3.4.1 事件類型
3.4.2 事件排程
3.5 系統Bundle
3.6 Bundle 上下文
3.7 本章小結
第4章 服務層標準與原理
4.1 服務
4.2 OSGi 服務範例
4.3 服務屬性
4.3.1 屬性篩檢程式
4.3.2 預先定義屬性
4.3.3 修改屬性
4.4 服務工廠
4.5 服務追蹤器
4.6 參考服務
4.7 釋放和登出服務
4.8 服務層事件
4.8.1 事件類型
4.8.2 事件排程
4.8.3 ServiceRegistration 物件的提前請求
4.9 遠端服務
4.9.1 準備遠端服務環境
4.9.2 遠端服務範例
4.9.3 遠端服務屬性
4.9.4 實現分析
4.10 服務勾子
4.10.1 EventListenerHook
4.10.2 FindHook
4.10.3 ListenerHook
4.10.4 服務勾子範例
4.11 本章小結
第三部分 以Equinox 為基礎的OSGi 應用與實作
第5章 Equinox 啟航
5.1 建立Equinox 開發環境
5.1.1 建立執行環境
5.1.2 建立編譯及偵錯環境
5.1.3 建立開發環境
5.2 Equinox 常用元件簡介
5.3 Equinox 啟動器
5.4 使用程式啟動Equinox
5.5 本章小結5.2.1 安裝 Express
第6章 Equinox 基礎應用與原始程式解析?
6.1 實作專案—Neonat 討論區
6.1.1 背景與需求
6.1.2 模組劃分
6.1.3 基礎資料模組
6.1.4 持久化模組
6.1.5 使用者互動模組
6.1.6 執行效果
6.2 Equinox 原始程式解析
6.2.1 OSGi 容器啟動
6.2.2 Bundle 狀態恢復
6.2.3 解析Bundle 依賴關係
6.2.4 OSGi 類別載入器實現
6.3 本章小結
第7章 伺服器端OSGi?
7.1 OSGi 與Web 伺服器
7.2 HTTP Service 標準簡介
7.2.1 服務目標
7.2.2 服務介面
7.2.3 資源對映規則
7.2.4 請求處理過程
7.3 實作專案—Neonat 討論區的Web 模組
7.3.1 準備依賴項
7.3.2 使用HTTP Service
7.3.3 實現Web 互動功能
7.3.4 執行效果
7.4 HTTP Service 原始程式解析
7.4.1 BridgeServlet 與OSGi 容器啟動
7.4.2 BridgeServlet
與HTTP 請求委派
7.4.3 DelegateServlet 實現原理
7.5 本章小結 .
第8章 使用者管理服務?
8.1 User Admin 服務標準簡介
8.1.1 服務目標與基礎概念
8.1.2 驗證使用者身份
8.1.3 驗證使用者許可權
8.1.4 User Admin 事件
8.2 實作專案—Neonat 討論區使用者管理模組
8.2.1 需求與依賴項分析
8.2.2 使用者與使用者群組的實現
8.2.3 頁面許可權
8.2.4 使用者登入與身份驗證
8.3 User Admin 原始程式解析
8.3.1 使用者管理實現
8.3.2 外部服務使用實作
8.4 本章小結
第9章 Preferences 服務?
9.1 Preferences 服務標準簡介
9.1.1 服務目標
9.1.2 資料結構
9.1.3 屬性
9.1.4 平行處理
9.1.5 清理遺留資料
9.2 實作專案—Neonat 討論區持久化模組
9.2.1 開發實作
9.2.2 模組熱切換
9.3 Preferences 原始程式解析
9.3.1 資料結構實現
9.3.2 屬性存取
9.3.3 後端儲存系統
9.4 本章小結
第10章 宣告式服務?
10.1 宣告式服務標準簡介
10.1.1 服務目標
10.1.2 定義Component
10.1.3 Component 類型
10.1.4 Component 生命週期
10.1.5 Component 屬性
10.1.6 綁定與發佈服務
10.1.7 啟動與鈍化方法
10.1.8 Component 設定歸納
10.2 實作專案 — 使用宣告式服務改造Neonat 討論區
10.2.1 視覺化編輯工具
10.2.2 DS 容器管理
10.3 DS 容器原始程式解析
10.3.1 容器啟動
10.3.2 載入Bundle 中的Component
10.3.3 動態依賴解析
10.4 本章小結
第11章 Subsystems 服務?
11.1 服務目標
11.2 Subsystem 格式
11.3 Subsystem 中繼資料
11.3.1 SUBSYSTEM.MF 標識
11.3.2 DEPLOYMENT.MF 標識
11.4 Subsystem 類型與共用策略
11.5 組織管理Subsystem
11.6 Subsystem 部署與依賴策略
11.7 Subsystem 生命週期
11.7.1 安裝
11.7.2 解析
11.7.3 啟動
11.7.4 停止
11.7.5 移除
11.8 本章小結
第四部分 最佳做法
12章 OSGi 最佳做法?
12.1 Bundle 相關名稱命名
12.2 Bundle 劃分原則
12.2.1 恰如其分地分配Bundle 粒度
12.2.3 分離介面和實現
12.3 依賴關係實作
12.3.1 依賴分析工具
12.3.2 避免Require-Bundle
12.3.3 最小化依賴
12.3.4 避免循環依賴
12.3.5 Equinox x-* 依賴
12.4 Equinox 專有類別載入機制
12.4.1 Buddy Loading 類別載入機制
12.4.2 ClassLoaderDelegateHook 類別載入機制
12.5 Bundle 生命週期實作
12.5.1 啟動
12.5.2 停止
12.6 服務工廠的特殊性
12.7 處理非OSGi 的JAR 套件
12.8 啟動順序實作
12.8.1 避免啟動順序依賴
12.8.2 Start Level 的使用
12.9 Fragment Bundle 實作
12.10 保持OSGi 動態性
12.11 API Tools 實作
12.11.1 API Baselines
12.11.2 API Tools 註釋
12.11.3 API Version 版本管理
12.11.4 二進位檔案不相容
12.12 本章小結
第13章 Spring Dynamic Modules 實作?
13.1 Spring DM 入門
13.1.1 Spring DM 專案簡介
13.1.2 安裝Spring DM
13.1.3 簡單的Spring DM 範例
13.1.4 Bundle 和Spring 上下文
13.1.5 命名空間
13.2 Spring DM 進階
13.2.1 Spring DM 擴充設定
13.2.2 Web Extender
13.2.3 Spring DM 服務約束
13.2.4 在Spring 上下文中使用BundleContext
13.3 Spring DM 企業應用
13.3.1 規劃OSGi 元件
13.3.2 在Spring DM 中使用JPA
13.3.3 交易管理
13.3.4 OSGi 企業標準中的JPA
13.4 Spring DM 和Blueprint
13.5 本章小結
第14章 建構可測試的OSGi 系統?
14.1 單元測試的必要性
14.2 單元測試的重要性
14.3 可測試程式的特徵
14.4 OSGi 單元測試
14.4.1 如何組織測試程式
14.4.2 如何進行OSGi 單元測試
14.5 OSGi 整合測試
14.5.1 Eclipse JUnit Plug-in Test
14.5.2 Spring DM Test
14.5.3 Pax Exam
14.6 本章小結
附錄A Java 類別載入器簡介
附錄B Equinox 主控台指令
附錄C OSGi 子標準目錄
附錄D OSGi 相關專案
附錄E Equinox 啟動設定參數