原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/18/eclipse_plugin_1_2_2.html

 1. 生成OSGi工程

  首先打开新工程向导,选择创建Eclipse插件工程。在[目标平台(Target Platform)]选项中选择[OSGi 框架(OSGi framework)]。

图5-1 创建插件工程

  在选择模板的时候选择,Hello OSGi Bundle后点击完成。

图5-2 选择OSGi模板

  生成工程后,在Manifest编辑器中点击[启动框架(Launch the framework)]运行新生成的OSGi Bundle。执行后可能会出现大量的错误。原因是Eclipse中的OSGiBundle在OSGi框架中注册了,但是UI相关的部分没能启动。我们进入[运行设置(Run Configuration)],取消所有的Bundle绑定,只选中我们当前要测试的Bundle。(我自己作的工程即使都取消了运行也报错:(~~)

  在框架运行时,向控制台窗口输入开始和停止指令,看一下效果吧。

图5-4 Hello OSGi

 2. OSGi Service和Tracker

  上一节我们制作了一个简单的在启动和停止时输出消息的Bundle。代码很简单的实现了BundleActivator接口的sart()和stop()方法,在其中利用System.out.println打出了信息。

代码1

1
2
3
4
5
6
7
8
9
10
11
public class Activator implements BundleActivator {
 
    public void start(BundleContext context) throws Exception {
        System.out.println("Hello World!!");
    }
     
    public void stop(BundleContext context) throws Exception {
        System.out.println("Goodbye World!!");
    }
 
}

  在OSGi框架中为了生命周期管理提供了开始和停止方法,仅此而已,OSGi Bundle就可以运行起来了。OSGi框架有一种可以为多个Bundle提供作为共通(Common)使用的Service功能,称为OSGi Service。

代码2 最简单的OSGi Service

1
2
3
4
5
public class OSGiService {
    public void doSomething(){
        System.out.println("Running Common Service");
    }
}

代码3 执行OSGi Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Activator implements BundleActivator {
 
    public void start(BundleContext context) throws Exception {
        System.out.println("Hello World!!");
        // 注册OSGi Service
        context.registerService(OSGiService.class.getName(), new OSGiService(),
                new Properties());
    }
 
    public void stop(BundleContext context) throws Exception {
        System.out.println("Goodbye World!!");
        // 生成Service Tracker
        ServiceTracker tracker = new ServiceTracker(context,
                OSGiService.class.getName(), null);
 
        tracker.open();
        // 取得Service
        OSGiService service = (OSGiService) tracker.getService();
        // 执行Service
        service.doSomething();
    }
 
}

我们看一下上面的Bundle执行的效果。

代码4

1
2
3
4
5
6
Hello World!!
stop test
Goodbye World!!
Running Common Service
 
osgi>

 3. Bundel的安装和更新

  OSGi框架在JavaVM不重启的情况下也可以安装和卸载Bundle。下面我们做一个新的Bundle,NewBundle在启动和停止时输出一行消息。

代码5 NewBundle

1
2
3
4
5
6
7
8
9
10
11
public class Activator implements BundleActivator {
 
    public void start(BundleContext context) throws Exception {
        System.out.println("New bundle start!!");
    }
 
    public void stop(BundleContext context) throws Exception {
        System.out.println("New bundle stop!!");
    }
 
}

将该工程导出到c盘根目录下,启动OSGi控制台输入install file:\\\C:\plugins\NewBundle_1.0.0.201008182238.jar。再通过ss命令确认bundle的安装。

代码6 Bundle的安装和卸载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
osgi> install file:\\\C:\plugins\NewBundle_1.0.0.201008182238.jar
Bundle id is 321
 
osgi> ss New
 
Framework is launched.
 
id      State       Bundle
321     INSTALLED   NewBundle_1.0.0.201008182238
 
osgi> start NewBundle
New bundle start!!
 
osgi> uninstall NewBundle
New bundle stop!!
 
osgi> ss New
 
Framework is launched.
 
id      State       Bundle
 
osgi>

上面代码说明,在卸载Bundle的时候会先调用stop方法。对Bundle的MANIFEST文件的描述方法作一个简单的总结如下表:

项目名   说明
Manifest-Version Jar包的Manifest文件指定了版本号,通常是1.0
Bundle-ManifestVersion Bundle的Manifest文件指定了版本,通常是2
Bundle-Name Bundle的名称
Bundle-SymbolicName Bundle的Synbo名称,OSGi中以这个名称注册
Bundle-Version Bundle的版本。在OSGi中有可能多个不同版本的同一Bundle共存
Bundle-Activator 管理Bundle生命周期的类名
Bundle-Vendor 定义了制作Bundle的组织名称
Bundle-ActivationPolicy 指定了Bundle启动的策略。
Import-Package 指定了Bundle引用的包
Export-Package 指定了Bundle向起他Bundle公开的包
Required-Bundle 指定了Bundle引用的Bundle

[转]Eclipse插件开发之基础篇(5) 制作OSGi Bundle的更多相关文章

  1. Eclipse插件开发之基础篇(4) OSGi框架

    转载出处:http://www.cnblogs.com/liuzhuo. 1. 什么是OSGi框架 OSGi(Open Service Gateway Initiative)框架是运行在JavaVM环 ...

  2. [转]Eclipse插件开发之基础篇(4) OSGi框架

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/18/eclipse_plugin_1_2_1.html 1. 什么是OSGi框架 OSGi(O ...

  3. [转]Eclipse插件开发之基础篇(2) 第一个Eclipse插件

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/15/eclipse_plugin_1_1_1.html 在Eclipse中使用PDE(Plug ...

  4. [转]Eclipse插件开发之基础篇(1) 插件开发的基础知识

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/13/eclipse_plugin_1_0_2.html 名词翻译 有一些名词在翻译的过程中可能 ...

  5. [转]Eclipse插件开发之基础篇(6) SWT简介

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/09/01/eclipse_plugin_1_3_1.html SWT(Standard Widget ...

  6. [转]Eclipse插件开发之基础篇(3) 插件的测试与调试

    原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/17/eclipse_plugin_1_1_2.html 1. 使用JUnit对插件进行测试 E ...

  7. 关于Eclipse使用Git基础篇

    一:Git的下载与安装与基本使用 1.打开eclipse->help->Eclipse Markplace->search->fiind输入Egit 你会看到如下截图(我的为已 ...

  8. Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例

    <<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识 ...

  9. Eclipse插件基础篇一

    名词翻译 有一些名词在翻译的过程中可能会出现歧义,在这里统一一下. アーキテクチャ=architecture=架构 プラットフォーム=platform=平台 コンポーネント=component=组件 ...

随机推荐

  1. 看完这篇文章,我奶奶都知道什么是JVM中的内存模型与垃圾回收!

    扩展阅读:JVM从入门开始深入每一个底层细节 六.内存模型 6.1.内存模型与运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同数据区域. Java内存模型的主要目 ...

  2. Unity3D_Transform_位置、角度、缩放及其他

    1.位置 transforn.position  世界位置 transform.localPosition 相对父类位置 在屏幕左上方显示方法: private void OnGUI() { GUIL ...

  3. Cesium专栏-气象雷达动图(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  4. HTML中特殊符号编码对照表,html特殊符号编码都有哪些?

    HTML中一些无法打出来的符号可以用相应的代码进行代替显示,本文提供了一些HTML特殊符号相应的代码供开发者参考. 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 ...

  5. CSAPP 2-2 整数的表示和运算

    目录 1 整数表示 1 整数表示 编码整数有2种方式: 一种只能表示非负数(大于0的数), 另一种能够表示负数.零和正数. (1) 整型数据类型: C和C++都支持有符号(默认)和无符号数, Java ...

  6. raspberry-gpio-python(树莓派GPIO与Python编程)

    国外的设计接口设计得很棒,包括问题:读脏与防抖,还包括读这个数据提供了两种方式,一种是阻塞等待方式,还有一种是回调函数,前一种是通讯中常用的方式,后一种来自系统架构设计的整体性考虑.这种硬件接口设计的 ...

  7. Nginx一般配置

    文件为 nginx.conf ,一般配置内容如下: user root;worker_processes auto;#pid /var/run/nginx.pid;#error_log /dev/st ...

  8. Spark中持久化和序列化学习

    一.cache和persisit的对比 -rw-r--r--@ 1 hadoop staff 68M 5 17 07:04 access.log    cache/persitence是 laz ...

  9. IT开发、PM、UI/UE学习路线图(非原创-参考传智播客网站介绍)

    文章大纲 一.Go语言+区块链学习路线图二.PHP学习路线图三.Python学习路线图四.C/C++学习路线图五.大数据学习路线图六.经理学习路线图七.UI/UE路线图八.参考文章 一.Go语言+区块 ...

  10. MySQL 优化 (四)

    参数优化 innodb_log_buffer_size 此参数确定些日志文件所用的内存大小,以M为单位.缓冲区更大能提高性能,对于较大的事务,可以增大缓存大小. innodb_log_buffer_s ...