阅读本书,首先你很快就会使用Eclipse bundle工具创建第一个基于OSGi的系统,进而转向复杂的产品开发。接下来,你将掌握一些用于创建具有特殊模块化、高效性和可维护性系统的最佳实践和技巧。你将了解所有的OSGi声明式服务,以及如何通过这些服务来解决各种现实问题。最后,你会发现所有这些都在本书所提供的完整案例(从早期的原型构建到最终的应用交付)中得以实现。
目录
- 第一部分 简介
- 第1章 OSGi、Equinox和Eclipse 2
- 1.1 简史 2
- 1.2 合作 3
- 1.3 实战的模块性和自由性 4
- 1.4 平台 4
- 1.5 生态系统 5
- 1.6 OSGi的来龙去脉 5
- 1.6.1 Java的谎言 5
- 1.6.2 现状核实 6
- 1.6.3 OSGi的寿命 6
- 1.7 实践中的OSGi和Equinox 7
- 1.8 总结 8
- 第2章 OSGi基本概念 9
- 2.1 bundle环境 9
- 2.2 为何选择OSGi 10
- 2.3 bundle剖析 13
- 2.4 模块化 14
- 2.4.1 导出包 14
- 2.4.2 导入包 14
- 2.4.3 需要的bundle 15
- 2.4.4 强化模块化特性 16
- 2.5 模块化设计概念 16
- 2.6 生命周期 17
- 2.7 协作 18
- 2.7.1 服务 18
- 2.7.2 扩展和扩展点 19
- 2.8 OSGi框架 20
- 2.9 安全性 20
- 2.10 OSGi框架实现 21
- 2.11 总结 21
- 第二部分 OSGi示例
- 第3章 教程介绍 24
- 3.1 何为Toast 24
- 3.2 Toast的演变 26
- 3.3 开发环境安装 27
- 3.4 示例代码 28
- 3.4.1 在章与章之间切换 28
- 3.4.2 比较 29
- 3.5 目标平台设置 30
- 3.5.1 预定义的目标 31
- 3.5.2 定义目标平台 32
- 3.6 通过示例进行学习 35
- 3.7 总结 36
- 第4章 你好,Toast 37
- 4.1 简单的场景 37
- 4.1.1 创建工程 37
- 4.1.2 Gps 38
- 4.1.3 Airbag和IAirbagListener 40
- 4.1.4 EmergencyMonitor 41
- 4.1.5 Main 43
- 4.1.6 运行 43
- 4.1.7 检查点 43
- 4.2 将Toast划分为Bundle 43
- 4.2.1 GPS bundle 45
- 4.2.2 安全气囊bundle 47
- 4.2.3 紧急情况监视器bundle 47
- 4.2.4 启动 49
- 4.3 总结 50
- 第5章 服务 52
- 5.1 转移到服务 52
- 5.2 注册GPS服务 54
- 5.3 注册安全气囊服务 58
- 5.4 获取服务示例代码 61
- 5.5 启动 64
- 5.6 故障排解 64
- 5.7 总结 65
- 第6章 动态服务 66
- 6.1 动态服务简介 66
- 6.2 使用服务追踪器 67
- 6.2.1 修改bundle激活器 67
- 6.2.2 启动 70
- 6.2.3 服务追踪器小结 72
- 6.3 使用服务激活器工具包 73
- 6.3.1 在目标平台上安装SAT 73
- 6.3.2 修改GPS bundle激活器 73
- 6.3.3 修改安全气囊bundle激活器 74
- 6.3.4 修改紧急情况监视器bundle激活器 74
- 6.3.5 启动 75
- 6.3.6 SAT小结 76
- 6.4 使用声明式服务 76
- 6.4.1 修改GPS bundle 77
- 6.4.2 修改安全气囊bundle 79
- 6.4.3 修改紧急情况监视器bundle 80
- 6.4.4 运行 82
- 6.4.5 声明式服务总结 83
- 6.5 总结 83
- 第7章 客户端/服务器端交互 84
- 7.1 后台 84
- 7.1.1 核心bundle 84
- 7.1.2 后台应急bundle 85
- 7.2 客户端 88
- 7.2.1 信道bundle 88
- 7.2.2 紧急情况监视器bundle 92
- 7.3 工具类 94
- 7.3.1 常量 94
- 7.3.2 属性 94
- 7.3.3 日志 95
- 7.4 运行Toast 95
- 7.4.1 运行后台 96
- 7.4.2 运行客户端 97
- 7.5 总结 97
- 第8章 测试 99
- 8.1 使Toast具备可测试性 99
- 8.2 对Toast进行单元测试 100
- 8.2.1 测试方案 100
- 8.2.2 编写测试用例 101
- 8.2.3 运行单元测试 103
- 8.3 系统测试Toast 104
- 8.3.1 测试规划 104
- 8.3.2 创建测试工具 105
- 8.3.3 编写测试用例 107
- 8.3.4 运行系统测试 110
- 8.4 总结 111
- 第9章 打包 112
- 9.1 定义Toast产品 112
- 9.1.1 创建产品配置 112
- 9.1.2 概述页 114
- 9.1.3 依赖页 115
- 9.1.4 配置页 116
- 9.1.5 启动页 116
- 9.1.6 运行产品 118
- 9.1.7 产品化客户端 118
- 9.2 导出Toast 118
- 9.3 为其他平台打包 121
- 9.4 认真考虑组件定义 123
- 9.4.1 版本和版本范围 123
- 9.4.2 导出包和友元 124
- 9.5 总结 126
- 第10章 插件化服务 127
- 10.1 分离接口与接口的实现 127
- 10.1.1 将Fake Airbag与其接口相互分离 128
- 10.1.2 将模拟GPS与其接口相分离 129
- 10.1.3 回归测试 129
- 10.2 设备模拟 130
- 10.2.1 概念 130
- 10.2.2 设备模拟器框架 131
- 10.3 作为插件式服务的模拟设备 131
- 10.3.1 模拟安全气囊 131
- 10.3.2 模拟GPS 133
- 10.4 运行模拟设备 134
- 10.5 总结 135
- 第11章 可扩展的用户界面 136
- 11.1 Crust 136
- 11.1.1 Crust shell 136
- 11.1.2 Crust工具 137
- 11.2 紧急情况处理 138
- 11.2.1 创建可插拔的用户界面 138
- 11.2.2 重构紧急情况处理业务逻辑 139
- 11.2.3 紧急情况处理用户界面 140
- 11.2.4 运行用户界面 141
- 11.3 车载气候系统和音响系统 142
- 11.3.1 车载气候系统与音响设备 142
- 11.3.2 空调和音响屏幕 144
- 11.3.3 运行用户界面 144
- 11.4 OSGi应用模型 145
- 11.5 导航和地图 148
- 11.5.1 谷歌地球集成 148
- 11.5.2 地图支持 151
- 11.5.3 应用可扩展性和导航支持 152
- 11.5.4 运行用户界面 152
- 11.6 总结 154
- 第12章 动态配置 155
- 12.1 跟踪场景 155
- 12.2 安装跟踪代码 156
- 12.2.1 Core Tracking Bundle 156
- 12.2.2 后台跟踪bundle 157
- 12.2.3 客户端跟踪bundle 157
- 12.3 运行基本的跟踪场景 158
- 12.4 配置 159
- 12.4.1 OSGi的管理控制 159
- 12.4.2 客户端跟踪bundle 159
- 12.4.3 运行可配置的Toast 161
- 12.4.4 具备持久化配置的运行 162
- 12.5 总结 162
- 第13章 Web门户 163
- 13.1 门户 163
- 13.2 PortalServlet 164
- 13.3 使用服务进行操作查询 165
- 13.4 声明门户操作 168
- 13.5 白板模式的利与弊 170
- 13.6 总结 170
- 第14章 使用p2进行系统开发 171
- 14.1 Equinox p2 简介 171
- 14.1.1 架构 172
- 14.1.2 p2元数据——可安装的单元 172
- 14.1.3 组件 173
- 14.1.4 仓库 173
- 14.1.5 模式 174
- 14.1.6 指挥者 174
- 14.1.7 引擎 174
- 14.2 细化Toast结构 174
- 14.2.1 使用特性定义产品 175
- 14.2.2 后台特性 175
- 14.2.3 客户端特性 177
- 14.2.4 重构小结 180
- 14.3 编写一个配置器 180
- 14.3.1 配置器 181
- 14.3.2 配置后台 184
- 14.3.3 后台小结 184
- 14.4 增加一个Web部署页面 184
- 14.4.1 创建动作 185
- 14.4.2 管理动作 185
- 14.4.3 安装卸载动作 186
- 14.4.4 安装配置UI 186
- 14.5 导出、运行以及配置 186
- 14.5.1 引入一个p2仓库 186
- 14.5.2 运行Toast后台 189
- 14.5.3 创建并配置汽车 190
- 14.6 客户端动态部署 191
- 14.7 总结 192
- 第三部分 进阶篇
- 第15章 声明式服务 194
- 15.1 声明式服务模型 194
- 15.2 常见场景 195
- 15.2.1 最简单的组件 195
- 15.2.2 引用服务 197
- 15.2.3 提供服务 198
- 15.2.4 引用和提供服务 199
- 15.2.5 立刻激活组件 201
- 15.2.6 白板模式 202
- 15.2.7 工厂组件 207
- 15.3 启动和调试DS应用 213
- 15.4 PDE工具 214
- 15.5 总结 216
- 第16章 扩展 217
- 16.1 扩展注册 217
- 16.2 扩展点 219
- 16.3 扩展 221
- 16.4 高级扩展主题 222
- 16.4.1 扩展ID 222
- 16.4.2 命名扩展和匿名扩展 222
- 16.4.3 扩展工厂 223
- 16.5 扩展注册机制的生命周期 223
- 16.6 动态扩展的应用场景 224
- 16.6.1 场景一:没有缓存 225
- 16.6.2 场景二:缓存扩展 225
- 16.6.3 场景三:缓存对象 227
- 16.7 服务与扩展 229
- 16.8 扩展注册的神话 231
- 16.9 总结 231
- 第17章 日志 232
- 17.1 日志服务规范 232
- 17.1.1 日志级别 232
- 17.1.2 记录日志 233
- 17.1.3 读取日志 233
- 17.1.4 监听日志 234
- 17.2 在Toast中使用LogService 234
- 17.3 使用LogReaderService 237
- 17.4 Toast的LogUtility类 239
- 17.5 Equinox的LogService实现 240
- 17.6 总结 242
- 第18章 HTTP支持 243
- 18.1 HttpService 243
- 18.2 注册和注销Servlet 245
- 18.3 声明式HTTP内容注册 248
- 18.4 使用Jetty 248
- 18.5 HTTP上下文和JAAS集成 249
- 18.5.1 基于HTTP的认证和登录 249
- 18.5.2 运行具备安全机制的客户端 252
- 18.6 疑难解答 253
- 18.6.1 BindException 253
- 18.6.2 HttpService在监听哪个端口 253
- 18.7 总结 254
- 第19章 服务器端 255
- 19.1 服务器端和OSGi 255
- 19.2 在Web应用中嵌入Toast后台系统 257
- 19.2.1 更新产品 257
- 19.2.2 Web应用的Root文件 259
- 19.2.3 构建Web应用 261
- 19.2.4 运行Web应用 262
- 19.2.5 疑难解答 264
- 19.2.6 <init-param>参数说明 265
- 19.3 OSGi中的远程服务 265
- 19.3.1 Eclipse通信框架 266
- 19.3.2 远程服务 266
- 19.3.3 分布式Toast 266
- 19.3.4 远程服务主机 267
- 19.3.5 远程服务客户端 268
- 19.3.6 服务发现 269
- 19.3.7 运行分布式系统 270
- 19.4 总结 271
- 第20章 发布工程 272
- 20.1 什么是PDE构建 272
- 20.2 build.properties bundle 273
- 20.2.1 控制属性 274
- 20.2.2 使用自定义构建脚本 275
- 20.3 创建构建器 275
- 20.3.1 调整PDE构建的目标 276
- 20.3.2 build.properties 276
- 20.4 运行构建器 279
- 20.5 调整构建 282
- 20.5.1 自定义构建脚本 282
- 20.5.2 仓库和附加依赖项 283
- 20.5.3 从SCM(软件配置管理)系统中提取内容 283
- 20.5.4 获取map文件 285
- 20.5.5 自动替换版本号 286
- 20.5.6 设定版本号 286
- 20.5.7 定位和放置根目录文件 287
- 20.6 构建附加特征 288
- 20.6.1 创建特征构建器 288
- 20.6.2 build.properties 288
- 20.6.3 运行特征构建 290
- 20.7 构建WAR包 291
- 20.8 总结 291
- 第四部分 参考篇
- 第21章 动态性的最佳实践 294
- 21.1 动态性与你 294
- 21.2 Toast的动态性 295
- 21.3 动态性的挑战 296
- 21.4 动态性意识 297
- 21.4.1 对象处理 298
- 21.4.2 bundle监听器 299
- 21.5 扩展者模式和BundleTracker 300
- 21.6 动态性启用 300
- 21.7 启动和停止的动态性 302
- 21.7.1 启动级别 303
- 21.7.2 正确使用服务 304
- 21.7.3 关闭也不总是易事 304
- 21.8 总结 305
- 第22章 整合代码库 306
- 22.1 bundle形式的JAR 306
- 22.2 采用注入的方式进行bundle化 307
- 22.3 通过包装的方式进行bundle化 309
- 22.4 通过引用的方式进行bundle化 310
- 22.5 使用bnd进行bundle化 312
- 22.6 解决类加载问题 312
- 22.6.1 Class.forName() 312
- 22.6.2 与上下文类加载器有关的问题 316
- 22.6.3 管理JRE类 317
- 22.6.4 序列化 318
- 22.7 总结 318
- 第23章 高级主题 319
- 23.1 Equinox控制台 319
- 23.2 OSGi中的角色 322
- 23.3 bundle的形态 323
- 23.4 片段 325
- 23.5 单例 327
- 23.6 bundle生命周期 328
- 23.6.1 生命周期状态 328
- 23.6.2 BundleActivator 329
- 23.6.3 激活器的弊端 330
- 23.6.4 激活器的使用 330
- 23.7 bundle激活策略 331
- 23.8 控制bundle启动 332
- 23.8.1 持久化启动 332
- 23.8.2 启用激活策略 333
- 23.8.3 osgi.bundles 333
- 23.9 类加载 334
- 23.9.1 类查找算法 334
- 23.9.2 声明导入和导出 335
- 23.9.3 导入包与需要的bundle 335
- 23.9.4 可选性 336
- 23.9.5 use指令 336
- 23.9.6 再导出 337
- 23.9.7 x-internal和x-friends 337
- 23.9.8 引导代理 337
- 23.10 配置和运行Equinox 338
- 23.10.1 config.ini 338
- 23.10.2 可执行程序 339
- 23.11 数据区 341
- 23.12 总结 343
- 第24章 声明式服务引用 344
- 24.1 组件XML模式v1.0.0 344
- 24.1.1 声明XML的命名空间和模式 344
- 24.1.2 <component>元素 345
- 24.1.3 <implementation>元素 347
- 24.1.4 <property>元素 347
- 24.1.5 <properties>元素 348
- 24.1.6 <service>元素 349
- 24.1.7 <provide>元素 349
- 24.1.8 <reference>元素 349
- 24.2 组件的生命周期 351
- 24.2.1 满足组件的配置 351
- 24.2.2 组件的激活、注销与修改 353
- 24.2.3 访问引用服务 355
- 24.2.4 组件的即时性 357
- 24.2.5 组件属性 357
- 24.3 总结 359