OSGi#1:Equinox 初探

From a code point of view, Equinox is an implementation of the OSGi core framework specification, a set of bundles that implement various optional OSGi services and other infrastructure for running OSGi-based systems.

上面是Equinox官网的描述,Equinox是一个OSGi实现,具体就不赘述了,下面来看看Equinox该怎么玩,直接上代码。

按照惯例,来个Hello World的栗子。先打出一个输出Hello World的bundle,

package me.kisimple.just4fun.osgi;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class IBundleActivator implements BundleActivator {

    @Override
    public void start(BundleContext bundleContext) throws Exception {
        System.out.println("Hello,World.");
    }

    @Override
    public void stop(BundleContext bundleContext) throws Exception {
        System.out.println("Goodbye,World.");
    }

}

MANIFEST.MF这么写,

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloWorld
Bundle-SymbolicName: me.kisimple.just4fun.osgi.HelloWorld
Bundle-Version: 1.0.0
Bundle-Activator: me.kisimple.just4fun.osgi.IBundleActivator
Bundle-Vendor: KISIMPLE
Bundle-Localization: systembundle
Import-Package: org.osgi.framework

然后打包,

> jar cvfm me.kisimple.just4fun_1.0.0.jar MANIFEST.MF me\kisimple\just4fun\osgi\IBundleActivator.class

接下来需要去官网下载Equinox的SDK,我下的是equinox-SDK-LunaSR2.zip。然后参考官网的quick start文档,我们新建一个container目录,该目录有如下文件,

E:\Projects> tree container /F
E:\PROJECTS\CONTAINER
│  org.eclipse.equinox.common_3.6.200.v20130402-1505.jar
│  org.eclipse.osgi_3.10.2.v20150203-1939.jar
│  org.eclipse.update.configurator_3.3.300.v20140518-1928.jar
│
├─configuration
│      config.ini
│
└─plugins
        me.kisimple.just4fun_1.0.0.jar
        org.apache.felix.gogo.command_0.10.0.v201209301215.jar
        org.apache.felix.gogo.runtime_0.10.0.v201209301036.jar
        org.apache.felix.gogo.shell_0.10.0.v201212101605.jar
        org.eclipse.equinox.console_1.1.0.v20140131-1639.jar

除了me.kisimple.just4fun_1.0.0.jarorg.eclipse.update.configurator_3.3.300.v20140518-1928.jar,其他jar包都是从下载下来的SDK中可以拿到的,me.kisimple.just4fun_1.0.0.jar是上面我们打的输出Hello World的bundle,而org.eclipse.update.configurator_3.3.300.v20140518-1928.jar则是从eclipse(忘记安装的是哪个版本了>_<)的安装目录下的plugins目录中获取(本身eclipse也使用了Equinox,所以也有configuration/config.ini文件和plugins目录)。

configuration/config.ini如下,

osgi.bundles=org.eclipse.equinox.common@2:start, org.eclipse.update.configurator@3:start

alright,接下来就可以启动Equinox了,

E:\Projects\container>java -jar org.eclipse.osgi_3.10.2.v20150203-1939.jar -console
osgi> _

org.eclipse.osgi_3.10.2.v20150203-1939.jarMain-Classorg.eclipse.core.runtime.adaptor.EclipseStarter,除了-console,还支持一些其他选项。源码可以使用git获得,

> git clone http://git.eclipse.org/gitroot/equinox/rt.equinox.framework.git

接下来可以在命令行中启动我们的bundle了。先用ss命令看下bundle的情况,

osgi> ss
"Framework is launched."

id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.10.2.v20150203-1939
1       ACTIVE      org.eclipse.equinox.common_3.6.200.v20130402-1505
2       ACTIVE      org.eclipse.update.configurator_3.3.300.v20140518-1928
3       RESOLVED    me.kisimple.just4fun.osgi.HelloWorld_1.0.0
4       ACTIVE      org.apache.felix.gogo.command_0.10.0.v201209301215
5       ACTIVE      org.apache.felix.gogo.runtime_0.10.0.v201209301036
6       ACTIVE      org.apache.felix.gogo.shell_0.10.0.v201212101605
7       ACTIVE      org.eclipse.equinox.console_1.1.0.v20140131-1639

启动我们的bundle,

osgi> start 3
Hello,World.

这时候再用ss命令可以看到我们的bundle的状态变成了ACTIVE了,

3       ACTIVE      me.kisimple.just4fun.osgi.HelloWorld_1.0.0

停掉我们的bundle,

osgi> stop 3
Goodbye,World.

这时候bundle的状态就会又回到了RESOLVED

参考资料

时间: 2024-12-28 12:53:27

OSGi#1:Equinox 初探的相关文章

OSGi与Equinox创建高度模块化系统

问题描述 OSGi与Equinox创建高度模块化系统 有没有哪位大侠学过<OSGi与Equinox创建高度模块化系统>这本书,跪求指导啊,如果同在一个区域,可当面交流并重谢... 解决方案 开发平台" rel="nofollow">http://osgi.help 有成熟的开源开发平台.

《深入理解OSGi:Equinox原理、应用与最佳实践》一1.1 什么是OSGi

1.1 什么是OSGi OSGi(Open Service Gateway Initiative,直译为"开放服务网关")实际上是一个由OSGi联盟(OSGi Alliance,如图1-1所示)发起的以Java为技术平台的动态模块化规范. OSGi联盟是由Sun Microsystems.IBM.Ericsson等公司于1999年3月成立的一个世界性的开放标准化组织,最初的名称为Connected Alliance,该组织成立的主要目的原本在于使服务提供商通过住宅网关为各种家庭智能设备

《深入理解OSGi:Equinox原理、应用与最佳实践》一2.4 Bundle的组织与依赖

2.4 Bundle的组织与依赖 既然是以模块化方式开发一个系统,那么必不可少的步骤是根据业务和技术的需要,将系统划分为多个模块,通过这些模块互相协作完成系统的功能.系统中绝大部分模块都不是孤立的,通常会依赖其他模块所导出的某些Package,又会被另外一些模块所依赖.这种依赖关系在元数据配置中简单体现为Import-Package.Export-Package和Require-Bundle标记的配置,使用起来并不算复杂,但是各个OSGi框架的实现者都要花费大量心思在组织Bundle与管理依赖上

《深入理解OSGi:Equinox原理、应用与最佳实践》一3.3 启动级别

3.3 启动级别 开发人员可以使用代码来启动.停止某些Bundle,用户也可以在Equinox控制台中完成这项工作.但是从OSGi系统整体来看,各个模块的启动和停止顺序不应当由代码或人工完成,尤其是在Bundle数量很多时,OSGi框架提供一种全局的控制Bundle启动.停止的方案就显得更有必要了.OSGi规范定义了"启动级别"来满足这个需求,对于熟悉Linux系统的读者,对比下文的介绍就会发现,OSGi中的启动级别和Linux系统的启动级别非常相似. 启动级别是一个非负的整数,值为0

《深入理解OSGi:Equinox原理、应用与最佳实践》一3.5 系统Bundle

3.5 系统Bundle OSGi框架本身也会以一个Bundle的形式向其他Bundle提供资源.Package和服务,比如已经在书中多次出现的Bundle.BundleContext.FrameworkListener等接口,以及后面将会介绍的EventAdmin.PackageAdmin等服务都是由系统Bundle提供的.OSGi规范规定了系统Bundle的Bundle ID固定为0,Bundle的getLocation()方法返回固定字符串"System Bundle",这些特征

《深入理解OSGi:Equinox原理、应用与最佳实践》一1.2 为什么使用OSGi

1.2 为什么使用OSGi 没有什么技术是万能的,任何一门技术都有它的适用场景和最佳实践方法.OSGi不只是一门技术,更多的是一种做系统架构的工具和方法论,如果在不适用的场景中使用OSGi,或者在适用的场景中不恰当地使用OSGi,都会使整个系统产生架构级的缺陷.因此,了解什么时候该用OSGi是与学会如何使用OSGi同样重要的事情. 每个系统遇到的业务环境都是不一样的,笔者不希望以经验式的陈述去回答"什么时候该用OSGi"或 "为什么要使用OSGi"这样的问题,而试图

《深入理解OSGi:Equinox原理、应用与最佳实践》一2.1 OSGi规范概要

2.1 OSGi规范概要 目前最新的OSGi规范是2012年7月发布的Release 5,Version5.0(后文简称为R5.0)版本,该规范定义了Java模块化系统所涉及的各种场景(开发.打包.部署.更新和交互等),以及其中用到的标准接口和参考模型.它是一份内容很全面.涉及范围很广泛的技术规范,从嵌入式系统到大型服务器系统,从模块的编码开发到部署使用,从OSGi核心框架到外围扩展服务都有专门的定义. OSGi规范并不是单一的规范文档,而是由一系列子规范构成,这些子规范主要可分为两大部分,其中

《深入理解OSGi:Equinox原理、应用与最佳实践》一2.6 定义执行环境

2.6 定义执行环境 某些Bundle必须在特定的执行环境之下才能正常运作,例如为大型服务端应用而设计的Bundle一般不能运行在嵌入式设备之中,而利用JDK1.6开发的Bundle无法运行在JDK1.5的应用服务器之中等.为了确保Bundle可用性,元数据信息中提供了Bundle-RequiredExecutionEnvironment标记来描述Bundle对执行环境的要求,示例如下: Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundatio

《深入理解OSGi:Equinox原理、应用与最佳实践》一3.2 Bundle状态及转换

3.2 Bundle状态及转换 "状态"是Bundle在运行期的一项动态属性,不同状态的Bundle具有不同的行为.生命周期层规范定义了Bundle生命周期过程之中的6种状态,分别是:UNINSTALLED(未安装).INSTALLED(已安装).RESOLVED(已解析).STARTING(启动中).STOPPING(停止中).ACTIVE(已激活),它们的含义为: UNINSTALLED,未安装状态.处于未安装状态的Bundle导出的Package和包含的其他资源都是不可使用的.但