JES服务程序
颜修为
2023-12-01
JES,是Java嵌入服务器-Java Embedded Server的缩写。在嵌入系统中使用Java,是Java跨平台战略的重要组成部分。国内目前并无比较系统的中文文献。
从最简单的包(bundle)开始
简介
每个包(bundle)都至少需要一个包激活器类,用来激活包,还要有一个清单(manifest)文件。包激活器类是一个实现org.osgi.framework.BundleActivator 的类,它定义了start (开始)和stop (结束)方法的逻辑。JES框架使用start 和stop方法来启动和停止包。
在这个例子里,我们建立一个简单的包(bundle),在它里面没有什么服务,仅仅在启动的时候显示Hello ,在停止的时候显示Bye 。请按以下步骤进行:
用Java编写一个包激活类
用文本文件的格式建立一个清单(Manifest)文件。
建立一个JAR文件,里面包含编译好的激活器类以及清单(Manifest)文件。
启动 JES框架,并安装、运行、停止包。
稍后,如果要建立复杂的包,你将编写服务,用服务处理处理框架工作的事件,利用JES核心服务;你还要给包激活器这个类增加功能。
BundleContext(包环境)对象
现在,是介绍BundleContext(包环境)对象的时候了。这个对象让包能够与JES框架相互作用。
在框架启动一个包的时候,就建立一个BundleContext 对象,并把这个对象传递给包激活器的start 方法。利用BundleContext 对象里的方法,包可以安装自己、登记服务、取得其它已经安装的包的信息、取得对服务的引用、获取或释放服务对象、获取或翻译包(Bundle)对象和文件(File)对象、占用框架发布的事件。BundleContext 对象的内容,在本教程的后面还会详细介绍。
现在,你对BundleContext 对象需要了解这些事情:
只有 JES框架能够创建BundleContext对象,包不能创建它。
在包被激活的时候,BundleContext对象被传递给start方法。
在包停止的时候,BundleContext还被传递给stop方法。
现在,我们来看看,如何编写包的激活器类。
包的生命周期
每个包都有一个生命周期。在生命周期里,包可以被安装、激活、更新、灭活,直至最后卸载。生命周期就是我们从比较高的级别上观察这一连串事件时,事件经历的时间 (如果你对细节有兴趣,可以查阅OSGi 服务网关规范,发行版1.0)。
生命周期运行的步骤就象这样:
1. 安装包
JES框架读取包的内容,给包分配一个包ID,并且持续地缓存包的位置和状态。会建立一个专门的类引导,以访问包的资源。
2. 激活包
框架检测这个包所要求的Java类是否已经由其它的包导入了。如果别的包已经导入了相应的类,框架就调用包激活器类里的start 方法,登记包的服务。这时,包的服务开始运行。
在这一步,JES框架还要解决包之间的依赖关系,这样可以保证:如果包B依赖包A,那么在启动包B之前,包A已经存在。
3. 灭活包
框架调用包的stop 方法,取消服务的登记。服务停止运行。
4. 卸载包。
包从计算机上删除。
如果在包的生命周期期间出现错误, JES框架就会抛出一个BundleException(包异常),这是一种特殊的异常类型,只在包的生命周期当中发生。BundleException is是OSGI规范定义的一个标准异常 (在org.osgi.framework里),JES实现了这个异常。
第一步:编写包的激活器类
我们要建立的greeting1 这个包,它的激活器类Activator.java非常简单,只定义了start 和stop 二个方法。
代码示例1-1 一个简单的包激活器类(greeting1/Activator.java)
①
②
③
④
⑤
package greeting1;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
public class Activator implements BundleActivator {
public void start(BundleContext context) throws BundleException {
System.out.println( "Hello" );
}
public void stop(BundleContext context) throws BundleException {
System.out.println( "Bye" );
}
}
激活器类Activator 保存在包greeting1 里①。它从org.osgi.framework逐个导入了BundleActivator, BundleContext, 和BundleException 这几个类②,而没有导入整个org.osgi.framework包,这样降低了JES装载包激活器时占用的内存数量。
激活器Activator 实现BundleActivator (包激活器)这个接口③,定义了它的start 和stop 方法,所有的包激活器类都要实现这些功能。在start 方法④的实现里,用它抛出BundleException(包异常),而没有用BundleActivator里声明的java.lang.Exception 作为抛出异常的方法,因为BundleException (java.lang.Exception的子类) 是JES框架用来抛出有关包的生命周期问题的异常类型。start 的这个实现,在包启动的时候,会显示Hello。
stop 方法⑤也抛出BundleException ,在包停止的时候显示Bye 。
第二步:建立清单文件
在JES框架里安装的每个包,都包含一个清单(Manifest)文件。清单文件是标准的文本文件,它描述了JAR文件里的内容。清单文件是结构化组织的文件,每个段都由一个头组成,每个头都有一个属性。例如,参见greeting1/Manifest文件,它的内容是:
BundleActivator: greeting1.Activator
这个清单文件只有一个头,它告诉JES框架,用哪个类作为包的激活器类。
头给JES框架提供了“钩子”,可以钩上包里包含的文件和资源。通过这种途径,框架就能知道,当包在生命周期中移动的时候,在包里的什么地方去找到资源(例如:包激活器)。
OSGi 规范义了能够在清单文件里供JES包使用的头(如表1-1所示)。但是表1-1 只显示了头的名称。每个头都有一套规定好的语法,必须用它的语法给它指定属性。不过,学习这份教程,并不需要了解语法的细节内容。如果你对细节感兴趣,可以参阅Java 嵌入服务器 2.0 开发人员指南。
表 1-1 在包的清单文件里可以使用的头
头
说明
Bundle-Activator
包激活器
Bundle-ClassPath
包的类路径
Bundle-ContactAddress
包的联系人地址
Bundle-Description
包的描述
Bundle-Vendor
包的开发商
Bundle-DocURL
包的文档URL
Bundle-Name
包名称
Bundle-NativeCode
包的本机码
Bundle-UpdateLocation
包的更新位置
Import-Service
导入服务
Bundle-Version
包的版本
Export-Package
导出包
Export-Service
导出服务
Import-Package
导入包
第三步:建立包的JAR文件
现在,我们有了一个包激活器类和一个清单文件,可以建立包了。建立包,可以使用gnumake (Solaris 平台)或者nmake (Windows平台)这两个工具。
在Windows NT上的操作方法如下:
1.打开一个 MS-DOS 命令窗口
2.转到greeting1目录,就象这样:
C:cd jes2.0docs utorialgreeting1
3. 建立 JAR 文件:
C: make
4. 检测是否成功创建了JAR 文件:
C:cd jes2.0docs utorialuildundles
C:dir greeting1.jar
第四步:安装、运行包
要启动JES框架,单击开始菜单,然后是程序>Java Embedded Server2.0>Java Embedded Server 2.0 Frame。
当JES框架启动时,在MS-DOS窗口时,可以看到下面内容:
Java Embedded Server 2.0
Copyright 1998, 1999 and 2000 Sun Microsystems, Inc.
All rights reserved. Use is subject to license terms.
Type ‘h[elp]’ for a list of commands.
>
要打开JES工具包JES Tools Portal—单击开始菜单,然后是程序>Java Embedded Server 2.0>Java Embdded Server 2.0 Tools Portal.
在Tools Portal里,单击管理面板,打开JES的管理面板 JES Management Panel。
在管理面板里,单击包(Bundles)标签。
在要安装的包文件(Bundle File to Install)里,找到greeting1 这个包(缺省是jes2.0/docs/tutorial/build/bundles/greeting1.jar),然后单击安装。
在右侧面板的列表中看到greeting1 时,单击开始。
检查在右侧面板中显示的greeting1.jar的详细内容.