1、概述
在上文中讲到,Equinox包括核心框架,标准服务实现,面向J2EE的应用,新的部署更新框架及一些其他的研究方向。本文主要针对Equinox实现的OSGi核心框架及Equinox OSGi运行环境的搭建过程进行详细讲述。
用户在阅读下文时,应具有基本的Java编程及打包的概念并对OSGi标准的构成有一定的了解,理解OSGi框架及Bundle的概念。
2、OSGi核心框架
从OSGi核心框架示意图可以看到,OSGi核心框架主要包括模块层,生命周期层,服务层及安全层组成。完整的OSGi核心框架实现,还包括包管理服务(Package Admin)、启动层次服务(Start Level)、条件许可管理(Conditional Permission Admin)、权限管理(Permission Admin)及URL处理服务(URL Handlers)等框架服务。
关于OSGi核心框架的详细介绍请参考OSGi标准规范。
3、Equinox的OSGi Framework实现
Equinox的OSGi框架实现包含在org.eclipse.osgi插件项目中。在发布的Eclipse环境中,用户可以在Eclipse安装目录下的plugins目录中找到该插件。该插件一般以"org.eclipse.osgi_<版本号>.jar"的JAR文件形式打包。由于是从Eclipse3.0以前版本迁移到OSGi核心的缘故,目前的Equinox OSGi 实现中包含的代码非常繁杂。
在org.eclipse.osgi项目源代码中用户可以看到除了OSGi接口及框架实现外,还包括adaptor接口及默认的adaptor(defaultAdaptor),eclipse adaptor(eclipseAdaptor)实现,控制台实现(console),附加服务扩展(supplement),Bundle组件解析(resolver)和Bundle JAR文件校验等功能。
在实际使用中,用户使用该Jar文件即可将OSGi框架运行起来(参考下文OSGi运行环境的搭建)。作为一个产品级的应用,往往存在很多系统级的参数可供用户进行配置以调整系统的运行行为而满足不同环境的要求。同样,Equinox运行环境也提供了大量的运行参数以供用户选择配置。配置Equinox运行环境参数的方式主要有两种,一种是使用JVM环境变量;另一种方式是使用Equinox的配置文件(config.ini)。
用户在获取到org.eclipse.osgi_<版本号>.jar文件后,可以尝试以命令行的方式启动该Jar文件。该Jar文件的入库主类是:org.eclipse.core.runtime.adaptor.EclipseStarter。
java -jar org.eclipse.osgi_3.3.1.R33x_v20070828.jar
用户会发现该程序执行后立即退出,控制台上没有任何输出。这是因为不存在拥有可持续运行的代码功能,框架启动后即退出主线程。下文中,我们会给出OSGi运行环境搭建的详细过程。
4、搭建Equinox OSGi运行环境
4.1 原始的OSGi环境
从Eclipse官方网站下载Equinox OSGi框架。将其下载到c:/equinox目录中。本文中使用的Equinox版本为3.3.1。直接从命令行运行该jar文件时程序执行后会立即退出,为了更好的了解Equinox OSGi框架的特点,我们在运行时添加JVM参数"osgi.console"。如下图所示:
执行"java -Dosgi.console -jar org.eclipse.osgi_3.3.1_R33x_v20070828.jar"后,系统给出"osgi>"命令输入提示。输入"ss"命令后回车,用户可以看到上图所示"Framework is launched."的信息。同时,下方显式了系统启动的Bundle列表,id列为该Bundle在OSGi运行环境中的唯一运行标识,State列为该Bundle当前的状态,Bundle列显示了该Bundle组件的SymbolicName。
此时,OSGi框架已经处于运行状态。
Equinox OSGi Console提供了很多命令用于与OSGi框架交互,用户可以输入任何非OSGi Console的内部命令字符,控制太将显示Equinox Console提供的所有命令。如下下图所示:
执行"services"命令,用户可以看到当前OSGi框架中发布的所有的服务信息。
4.2 以运行参数方式向OSGi环境中部署Bundle
下载Equinox SDK,将plugins目录下的org.eclipse.osgi.services_3.1.200.v20070605.jar文件拷贝到C:/equinox目录下。修改命令行运行参数如下:
java -Dosgi.console -Dosgi.bundles=org.eclipse.osgi.services_3.1.200.v20070605.jar-jar org.eclipse.osgi_3.3.1_R33x_v20070828.jar
执行该命令,系统运行结果如下图所示:
从运行结果可以看出,JVM参数"-Dosgi.bundles=org.eclipse.osgi.services_3.1.200.v20070605.jar"将org.eclipse.osgi.services组件部署到了OSGi运行环境中。此时,该组件的状态为"RESOLVED",即该组件被框架解析但没有启动。如果用户希望组件在加载的同时启动该组件,可以修改上述参数为:
-Dosgi.bundles=org.eclipse.osgi.services_3.1.200.v20070605.jar@2:start。
"@2"指明该组件的启动级别,":"后的"start"标明该组件在加载后启动。按修改后的参数重新执行命令输出结果如下图所示:
从上图可以看出,部署的org.eclipse.osgi.services组件在加载后被OSGi框架启动,其状态显示为"ACTIVE"。
4.3以配置文件方式向OSGi环境中部署Bundle
从上述部署Bundle的方式看出,当部署多个Bundle时,使用JVM参数配置方式是不可取的。Equinox OSGi支持从配置文件中读取加载的Bundle,下面我们演示如何使用配置文件部署多个Bundle。
将Equinox SDK中plugins目录下的org.eclipse.osgi.util_3.1.200.v20070605.jar文件拷贝到C:/equinox目录下。
Equinox OSGi提供了环境变量"osgi.configuration.area",该变量指明了配置文件config.ini的存储路径。下面我们在C:/equinox目录下添加config.ini文件,并在该文件中添加如下内容:
osgi.bundles=org.eclipse.osgi.services_3.1.200.v20070605.jar@2:start, org.eclipse.osgi.util_3.1.200.v20070605.jar
修改OSGi框架启动命令行为:
java -Dosgi.console -Dosgi.configuration.area=.-jar org.eclipse.osgi_3.3.1_R33x_v20070828.jar
执行上述命令后的输出结果如下图所示:
5、使用Eclipse Launcher启动Equinox OSGi
熟悉Eclipse IDE环境的用户会注意到3.2版本(包括3.2)以前Eclipse安装目录下存在eclipse.exe和startup.jar两个文件,用于启动Eclipse运行环境。从3.3版本开始,Equinox将startup.jar拆分为两个不同的Bundle(Fragment)放置在了plugins目录下。用户可以从Equinox站点下载Launcher。下载后的3.3.1发布版本的Launcher包括下面两个组件:
org.eclipse.equinox.launcher_1.0.1.R33x_v20070828.jar
org.eclipse.equinox.launcher.win32.win32.x86_1.0.1.R33x_v20070828 [目录]
在进行下述操作之前,我们需要调整C:/equinox的目录结构,在该目录下添加"configuration"和"plugins"两个目录,将所有的Bundle组件(包括目录)转移到plugins目录下;将config.ini文件转移到configuration目录下,将Launcher包中的"eclipse.exe"文件拷贝到C:/equinox目录下。此时的目录结构如下图所示:
plugins目录下的内容如下图所示:
修改命令行OSGi框架启动命令为:
eclipse.exe -console -noexit
执行该命令后,在弹出的控制台中输入"ss"命令,输出结果如下:
5.1使用eclipse.ini文件
除了从命令行传入eclipse.exe使用的运行参数外,用户也可以配置与eclipse.exe的文件同名的ini文件存放eclipse.exe运行所需要的参数。用户应将该ini文件放置在eclipse.exe所在的文件目录下。
我们在C:/equinox目录下添加eclipse.ini文件,在该文件中添加如下内容:
-console
-noexit
直接点击eclipse.exe程序图标启动Equinox OSGi运行环境。程序运行结果如下图所示:
至此,Equinox OSGi完整的运行环境已经搭建完成。如果用户希望将新的Bundle发布到该环境中,只需要修改configuration目录下config.ini文件,将新的bundle添加到osgi.bundles参数下。
6、常见问题
用户在上述操作步骤中,会发现在configuration目录下生成一些错误日志文件,如果用户发现日志中出现以下内容:
java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:72)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:508)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:447)
at org.eclipse.equinox.launcher.Main.run(Main.java:1173)
用户可以在config.ini文件中添加如下配置:
eclipse.ignoreApp=true
7、小结
在上文中,我们详细介绍了Equinox OSGi环境组成及其搭建过程。在下一篇文档中,我们会对Equinox OSGi的运行参数做详细的介绍,同时提供一种方式使得OSGi框架能够自动发现部署的OSGi bundle而不用频繁修改配置文件。
分享到:
相关推荐
- 创建一个新的OSGi Bundle项目,并添加必要的依赖库,包括Equinox运行时、Jersey核心库、以及Jersey对OSGi的支持库。 2. **引入Jersey库**: - 在`lib`目录下,你可能已经包含了Jersey的JAR文件,例如`jersey-...
OSGI 在 J2EE 环境下的应用越来越广泛,目前在 Servlet 应用中使用 OSGI 有两种方式:Servlet Container in OSGI 和 OSGI in Servlet Container. 前一种:和普通的 OSGI bundle 开发差不多,而后一种:Equinox 提供...
2. **Equinox环境搭建**:首先,需要安装Eclipse IDE,然后通过Eclipse的插件管理器安装OSGi开发所需的Equinox SDK。这样,我们就可以在Eclipse中创建和管理OSGi Bundle项目。 3. **创建OSGi Bundle**:在Eclipse中...
标题“OSGi and Equinox”和描述“OSGi and Equinox, Creating Highly Modular Java Systems”表明本文旨在介绍OSGi框架以及它在Eclipse环境下的具体实现Equinox。OSGi是一个Java模块化平台,它允许多个独立的模块...
- `org.eclipse.osgi_3.5.1.R35x_v20090827.jar`是EQUINOX OSGi框架的核心库,包含了运行OSGi环境所需的所有组件和服务。 - `com.javaworld.sample.helloworld.Activator.jar`是一个具体的OSGi Bundle示例,其中包含...
总结来说,使用Equinox开发OSGi应用程序涉及到理解OSGi核心概念,创建和配置bundle,使用服务,以及构建模块化应用架构。通过Eclipse和Equinox,开发者可以获得强大的工具支持,简化开发流程,实现高度可扩展和动态...
最近整OSGI,整的心情很是不爽,尤其最近搞equinox命令行下的bundle调试,搞两下就很厌倦输入java -jar equinox.jar -console,然后可怜的去加载一个个bundle,虽然通过config.ini可以一把加载相应需要的bundle,但是每次...
Equinox提供了运行OSGi Bundle的基本环境,包括Bundle生命周期管理、类加载器机制、服务注册与查找等功能。 ### 设置开发环境 为了进行基于Equinox的OSGi Bundle开发,首先需要确保以下软件已安装在你的机器上:...
OSGi框架的核心是其模块化系统,它将程序分割成一系列的“Bundle”,每个Bundle都是一个独立的模块,拥有自己的类加载器。这样做的好处是可以在运行时动态地添加、移除或者替换Bundle,而不需要停掉整个应用程序。...
### Equinox开发OSGi应用程序 #### OSGi及框架简介 **OSGi**(Open Service Gateway Initiative)是一种用于创建模块化Java应用程序和服务的框架。它最初是为了满足嵌入式设备和家庭网关的需求而设计的,但随着...
1. **Equinox简介**:Equinox是一个高度模块化、动态的Java运行环境,基于OSGi框架规范构建。它体积小巧,性能卓越,且高度可定制。Equinox是所有Eclipse系统的基础,从嵌入式航空自助登机亭、滑雪场闸门到丰富的...
OSGi和Equinox作为创建高度模块化的Java系统的基石,其价值在于它们提供的不仅仅是技术层面的解决方案,更是一种应对快速变化的技术环境的方法论。通过将大型应用分解为可独立部署的模块,OSGi和Equinox不仅简化了...
Equinox是Eclipse基金会实现OSGi核心规范的一个开源实现,它是OSGi联盟指定的参考实现之一。Spring DM(Dependency Manager)则是Spring框架对OSGi环境的支持,它使得Spring应用可以在OSGi容器中无缝运行。 在OSGi...
在这个“osgi基础demo-搭建servlet”项目中,我们将探讨如何在OSGi环境中创建并运行一个简单的Servlet应用程序。 首先,我们需要理解OSGi的核心概念。OSGi基于服务导向架构,每个模块称为一个Bundle,每个Bundle...
在本篇博文中,我们将探讨如何使用Equinox作为框架来开发OSGi应用程序。Equinox是Eclipse项目的一个组件,它提供了OSGi规范的实现,使我们能够构建模块化、可扩展且灵活的Java应用程序。OSGi(Open Service Gateway ...
2. **Equinox框架**:了解Equinox如何作为OSGi的实现,提供了用于管理OSGi模块的运行时环境。这包括bundle的加载、解析、启动和停止等操作,以及如何通过Equinox API与OSGi服务进行交互。 3. **Bundle开发**:学习...
5. **Equinox实现**:Equinox是OSGi R4规范的实现,它是Eclipse IDE的核心。了解其内部工作原理,如事件模型、类加载策略以及服务实现,有助于开发更高效的应用。 6. **源代码分析**:附带的equinox-SDK-3.8源代码...
在本章中,我们将深入探讨如何使用OSGi(Open Service Gateway Initiative)框架,特别是Equinox实现高度模块化的Java系统。Equinox是Eclipse基金会提供的一个OSGi实现,它允许开发者构建可热插拔的组件,使得系统...