关于OSGi的基本概念可以参看百科http://www.baike.com/wiki/OSGI

OSGi的核心存在就是为了模块化及业务隔离,而对于Java应用,这些主要是通过隔离ClassLoader实现的。

OSGi中定义,一个jar包被称为一个Bundle,Bundle之间的ClassLoader相互隔离。Bundle的元信息定义在META-INF/MANIFEST.MF文件中。一个Bundle A如果要将内部Class分享给其他Bundle,需要在其MANIFEST.MF中定义Export-Package声明,而Bundle B如果要引用Bundle A中的类,需要在其MANIFEST.MF中定义Import-Package或Require-Bundle声明。

由于Class加载机制的隔离性,OSGi与普通Web应用在开发维护上有些许不同。下面主要介绍如何使用Eclipse操作OSGi工程。

1 创建Eclipse工程#

在Eclipse中若要创建一个支持OSGi的工程,最快的办法就是创建一个”Plug-in Project”。

如果Target Platform选择Eclipse或其他时,可能会在MANIFEST中添加额外的语义。尽管不会影响运行,但基于简单原则针对非Eclipse插件开发环境仍然建议选择”standard”。
上图中,比较重要的信息包括:

  • ID: Bundle的唯一标识,对应MANIFEST.MF中的Bundle-Symbolic-Name
  • Version:Bundle的版本号,对应Bundle-Version
  • Name:Bundle的别名,对应Bundle-Name
  • Generate an activator:是否自动生成标准Activator,勾中则自动生成

点击Finish按钮,Eclipse Plug-in Project创建完毕。

使用Strato开发时,创建新无须如此复杂,我们的自动生成工具可以一秒生成新Project,并默认包含常用Bundle依赖配置。

2 配置MANIFEST.MF#

普通的Java工程,其ClassPath主要在.classpath文件中定义,开发者通过Java Build Path设置栏配置依赖的其他jar包。

在OSGi Bundle中,ClassPath主要由MANIFEST.MF文件定义,辅以Bundle-ClassPath标记,支持原生ClassLoader加载某些特殊的类。

Eclipse内置MANIFEST.MF编辑器,可以实现大部分的配置。

MANIFEST编辑器分为Overview、Dependencies、Runtime、Build、MANIFEST.MF、build.properties六个标签。

  • Overview
这个标签页主要定义了MANIFEST.MF的Bundle-Symbolic-Name、Bundle-Version和Bundle-Name属性,如图所示。
  • Dependencies
Required Plug-ins列表对应MANIFEST.MF的Required-Bundles属性

Import-Packages列表对应MANIFEST.MF的Import-Packages属性

  • Runtime
Export Packages列表对应MANIFEST.MF的Export-Packages属性。

ClassPath列表对应MANIFEST.MF的Bundle-ClassPath属性。

  • Build
该标签页提供Eclipse编译的可视化设置界面,相关修改对应build.properties的配置项。

  • MANIFEST.MF
该标签页提供友好的高亮显示编辑MANIFEST.MF源文件。
反复对MANIFEST.MF进行可视化修改并同步查看源文件是理解MANIFEST配置项的一个很有效的方法。
  • build.properties
该标签页提供build.properties源码编辑器。

3 发布与运行#

一般来说Java工程可以使用Eclipse的Export Jar导出成Jar包,但基于OSGi的项目都会有大量的Bundle,若手工一个个打包将会非常繁琐。 Strato提供了自动打包的Ant Task(Jar-all),可以一键将Workspace下的所有Bundle导出到目标目录。

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
png
1.png 22.3 kB 1 11-May-2017 23:10 Jarez
png
10.png 25.7 kB 1 11-May-2017 23:11 Jarez
png
2.png 24.9 kB 1 11-May-2017 23:10 Jarez
png
3.png 21.4 kB 1 11-May-2017 23:10 Jarez
png
4.png 7.9 kB 1 11-May-2017 23:10 Jarez
png
5.png 72.7 kB 1 11-May-2017 23:10 Jarez
png
6.png 62.5 kB 1 11-May-2017 23:10 Jarez
png
7.png 77.9 kB 1 11-May-2017 23:11 Jarez
png
8.png 48.0 kB 1 11-May-2017 23:11 Jarez
png
9.png 44.9 kB 1 11-May-2017 23:11 Jarez
« This page (revision-8) was last changed on 11-May-2017 23:28 by Jarez