- 浏览: 1148955 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
摘要:在进行Eclipse RCP开发的过程中,需要使用一些其他的资源(如图片、声音、配置文件、数据库等),我们一般将这些资源放到Plugin/Bundle的相应目录下(如 图片资源放到icons目录,声音放到sounds目录,数据库文件放到data目录)。本文先对Eclipse Plugin和Bundle进行分析,之后讲解了如何使用Eclipse API通过这些资源的相对路径(相对于Plugin/Bundle)获取这些资源的绝对路径的方法,最后总结了 org.osgi.framework.Bundle接口和FileLocator工具类的使用方法。
Bundle和Plugin
Eclipse Platform架构于OSGi核心之上,每个Eclipse Plugin就是OSGi的一个Bundle,因此在Eclipse RCP中Plugin和Bundle是等价的概念。
OSGi框架中定义了org.osgi.framework.IBundle接口,表示运行于OSGi环境中的一个Bundle。Eclipse RCP中定义了org.eclipse.core.runtime.Plugin抽象类,代表一个Eclipse插件。但是Plugin抽象类并没有实现 IBundle接口,而是在内部拥有一个IBundle对象实例。Plugin类实现了BundleActivator,控制其内部的IBundle对象 的启动和停止,并负责将BundleContext注入到IBundle对象实例中。
我们可以发现,在IBundle接口中定义了如下几个方法,可以获取位于在Bundle文件目录中的资源:
URL getResource(String name); | 通过Bundle的Class Loader加载资源,和Class.getResource(String)类似,注意如果当前的bundle是一个fregment,则返回null |
Enumeration getResources(String name) | 和上面的方法一样,不过由于Eclipse插件可以包括多个Fregment,每个Fregment中可以分别包含相对路径相同的文件,因此通过一个相对路径可能找到多个匹配的资源 |
URL getEntry(String path); | 在当前Bundle中根据Path找相应的Entry(此处的entry和resource到底有什么区别我还尚不清楚) |
Enumeration getEntryPaths(String path); | 和上面的方法一样,同getResources(String) |
Enumeration findEntries(String path, String filePattern, boolean recurse); |
根据path和pattern找相应的资源文件,可以使用通配符,如需要查找所有语言文件: bundle.findEntries(“OSGI-INF/l10n”, “*.properties”, true); |
如何获取当前的Bundle对象
开发Eclipse Plugin/Bundle应用首先需要创建Activator类,继承自 org.eclipse.ui.plugin.AbstractUIPlugin,该类继承自上文提到的 org.eclipse.core.runtime.Plugin类,OSGi框架在加载Plugin/Bundle的时候首先加载此Activator 类,然后调用此类中定义的start(BundleContext context)和stop(BundleContext context)方法启动和停止这个Plugin/Bundle。在这个类的父类Plugin中声明了Bundle类型实例,可以通过 getBundle()方法获取这个Bundle实例。
以下代码为Activator类中的start(BundleContext)方法,在其中调用了getResource(String)和 getEntry(String)两个方法,同时调用FileLocator.toFileURL(String)将URL转化为文件系统的路径
public void start(BundleContext context) throws Exception { super.start(context); plugin = this; System.out.println(Activator.getDefault().getBundle().getLocation()); URL url = Activator.getDefault().getBundle().getResource("META-INF/MANIFEST.MF"); System.out.println(url); System.out.println(FileLocator.toFileURL(url)); URL url2 = Activator.getDefault().getBundle().getEntry("META-INF/MANIFEST.MF"); System.out.println(url2); System.out.println(FileLocator.toFileURL(url2)); }
上面代码输出结果为:
bundleresource://709.fwk15218962:1/META-INF/MANIFEST.MF
file:/D:/demo/modeling-workspace/com.zhlwish.proppagedemo/META-INF/MANIFEST.MF
bundleentry://709.fwk15218962/META-INF/MANIFEST.MF
file:/D:/demo/modeling-workspace/com.zhlwish.proppagedemo/META-INF/MANIFEST.MF
通过结果可以很明显看到,使用getResource(String)和getEntry(String)获取到的URL是OSGi环境中的路径,需要通过FileLocator.toFileURL(String)方法将OSGi环境中的URL转化为文件系统中的URL。
至于getResource()和getEntry()有什么区别,我到Eclipse Forum里面提了问题,回答是:
- getResource uses the bundle’s class loader to load a resource. This resource could come from imported constraints (Import-Package, Require-Bundle) or from the local bundle classpath.
- getEntry only searches the bundles jar files itself and does not consider any constraints or the bundle’s class path (Bundle-ClassPath header).”
详见http://www.eclipse.org/forums/index.php/m/710032/#msg_710032
FileLocator
static URL find(Bundle bundle, IPath path, Map override); static URL find(URL url); static URL[] findEntries(Bundle bundle, IPath path); static URL[] findEntries(Bundle bundle, IPath path, Map override); static File getBundleFile(Bundle bundle); static InputStream openStream(Bundle bundle, IPath file, boolean substituteArgs); static URL resolve(URL url); static URL toFileURL(URL url);
看起来和Bundle中的方法那么的相似,归根结底,FileLocator中的方法也都是通过调用Bundle中的相对应方法来实现其功能的,除 了resolve(URL)和toFileURL(URL),后者之前演示过其功能,前者的功能也同样是将OSGi环境中的URL解析成为文件系统中的 URL。其实我不认为此FileLocator除去toFileURL()此方法外地其他方法有更好的地方,如果可能,还是直接用Bundle的方法更 好。
总结
很明显,在Bundle中查找文件资源需要通过FileLocator和Bundle两个类的协作才能完成,由于一般情况下Eclipse RCP的属性以及配置值存放于Eclipse Workspace中,从Bundle中读取资源的需求比较少。最主要的应用场景是,一些图片资源可以通过此方式读取,然后在Eclipse RCP应用中处理和显示。
发表评论
-
关于Felix Log Service
2012-12-07 16:44 1567OSGi服务纲要规范中定义了服务于OSGi平台的通用日志服 ... -
Maven 3 Felix 4 Eclipse 的搭建与部署(部分转载自别人文章)
2012-10-18 10:24 20324.1.开发环境搭建 4.2开发工具 Maven 3 F ... -
OpenCore:基于OSGi开发纯插件体系结构的WEB应用程序
2012-09-21 17:46 1423随着OSGi/Equinox逐渐成为Java EE服务端的基础 ... -
OSGi技术在Java Web开发中的应用
2012-09-20 11:26 1410随着 Java SE 对模块化功能原生支持的一再推迟(据最 ... -
OSGI典型的应用案例
2012-09-20 11:26 1634OSGI典型的应用案例主要有两个:分别是Eclipse和BMW ... -
OSGi特点
2012-09-20 11:26 12491、JRE版本无关性。虽然Java一直被人们认为是“Write ... -
OSGI与JMX 的关系
2012-09-19 17:09 1058不过重点是: JMX 本来设计的用途就只为了管理,我们不 ... -
在equinox环境开发web应用的"利器" -- registerResources()方法 详解
2012-09-19 17:07 1227registerResources()方法详解 1、简介 ... -
在equinox环境开发web应用的"利器" -- 序
2012-09-19 17:05 1362在equinox环境中开发web应用必须要借助一些工具包提供的 ... -
equinox环境下web应用资源的部署
2012-09-19 17:04 1306osgi的equinox实现环境下,web服务器和web应用都 ... -
OSGi产生的背景--在繁荣的混乱之中走出困惑
2012-09-19 16:58 1165软件的复杂性正在以惊 ... -
将web容器置于OSGi框架下进行web应用的开发
2012-09-16 14:26 3539将web容器置于OSGi框架下,其实就是将web容器做成OSG ... -
在Eclipse中开发OSGi Bundle
2012-09-16 14:26 1329Eclipse为开发OSGI Bundle提供了良好的支持,它 ... -
【第一代服务注册形式】 - 将一个Bundle注册为服务
2012-09-14 10:09 11551、创建业务接口类及其实现类 Java代码 ... -
Declarative Services规范简介及应用
2012-09-14 10:08 1421Declarative Services 是一 ... -
用FileInstall管理Bundle的动态安装、启动、卸载
2012-09-14 10:07 13321、文件目录如下: F:\study_osgi ... -
服务工厂 - Bundle消费者返回不同的服务对象
2012-09-14 10:03 1207一般情况下,服务对象在注册后,任何其它的Bundle在请求 ... -
服务跟踪(ServiceTracker)
2012-09-14 09:58 1159当多个Bundle使用同一 ... -
OSGi容器中Bundle之间Synchronous Communication
2012-09-11 17:07 1559OSGi Core定义了一个服务层,提供了一个Bundl ... -
OSGI 中嵌入 Http 服务器的运行环境
2012-07-31 13:44 3054Eclipse 4.2 OSGI 依赖的Bundle: or ...
相关推荐
8. `org.springframework.osgi.io`:这个模块提供了OSGI环境下的资源读取和加载功能,如读取bundle中的配置文件。 9. `org.springframework.osgi.core`:这是Spring OSGI的核心模块,包含了一些基础的OSGI服务和...
在OSGi环境中,每个bundle都是一个自包含的单元,拥有自己的类加载器,可以独立地加载、启动、停止和更新,而不会影响其他bundle。这一特性使得OSGi特别适合于大型复杂系统,尤其是需要频繁迭代和扩展的项目。 创建...
然而,在OSGi环境中,我们可以为每个版本的“myself”jar包创建一个独立的bundle,每个bundle都有自己的类加载器,它们可以并存且互不影响。 为了设置OSGi环境并进行测试,你需要以下步骤: 1. **配置OSGi框架**:...
而在OSGi环境中,每个Servlet被封装为一个独立的模块(Bundle),这些模块可以动态地安装、启动、更新和卸载,而不影响其他模块。 集成Servlet在OSGi中的步骤如下: 1. **创建Servlet Bundle**:首先,我们需要...
Felix Plugin则是在Felix OSGi环境中使用的插件,用于扩展和增强Felix的功能。 这篇名为“osgi felix plug in”的博文虽然链接不可用,但我们可以基于OSGi和Felix的基本概念来探讨相关的知识点。 1. **OSGi模块...
在OSGi环境中,增量开发意味着可以在不停止框架的情况下更新和重新部署bundle。 **2.10 与框架交互** 为了利用OSGi框架的功能,需要学习如何通过API与之交互。 #### 三、Bundle依赖 **3.1 引入示例应用** 为了...
- **RequireBundles**: 使用了`Require-Bundle`头字段的Bundle能够访问该依赖Bundle中所有的资源文件和导出的包。这意味着如果一个Bundle声明了对另一个Bundle的依赖,则它可以访问后者的所有公开资源。 - **...
在OSGi环境中,这些配置文件通常会被打包为一个Bundle,并通过特定的机制暴露给其他Bundle。 4. **创建Spring Extension Factory**:在Eclipse RCP中,你需要创建一个SpringExtensionFactory,这是一个特殊的工厂类...
在OSGi环境中,一个bundle就是可执行的Java模块,包含类、资源以及元数据。打包bundle的过程涉及到将Java代码、依赖库和其他资源整理成符合OSGi规范的.jar文件。 在Eclipse中,使用Maven进行bundle打包通常涉及以下...
4. **模块化开发**:在 OSGi 中,每个组件(bundle)都是一个独立的单元,有自己的类路径和生命周期。这使得组件之间可以解耦,便于维护和更新。 5. **服务注册与发现**:OSGi 通过服务注册表提供服务发现机制,...
SpringDM提供了一种方式,可以在OSGi环境中定义和管理Spring Beans,从而使得开发者能够利用Spring的强大功能同时享受OSGi带来的灵活性。 #### 必备知识与工具 在开始学习OSGI之前,有几个必备的知识点和工具需要...
3. **Struts2 OSGI插件**:使用Struts2的OSGI插件,如`struts2-osgi-plugin`,它允许Struts2框架与OSGI环境通信,发现并加载bundle中的Action和结果配置。 4. **配置Struts2**:在OSGI bundle中,你需要提供一个或...
如果Maven配置不正确,或者maven-bundle-plugin没有正确设置,可能会导致构建的bundle无法在OSGI环境中正常工作。 总的来说,解决OSGI错误需要深入理解模块化体系,掌握正确的配置和调试技术。这包括但不限于: 1....
4. **熟悉相关工具**:如Eclipse PDE(Plug-in Development Environment)或Maven Bundle Plugin,这些工具能简化OSGI应用的开发和构建过程。 5. **查阅文档**:官方文档和社区资源是学习的重要途径,了解最佳实践和...
**Spring OSGi 快速入门中文教程** OSGi(Open Service Gateway Initiative)是一个Java模块化系统,它允许开发者将应用程序分解为独立的模块或服务,这些模块可以互相依赖并且在运行时动态发现和组合。Spring OSGi...
在本文中,我们将深入探讨如何将Drools规则引擎转换为OSGi插件,以便在OSGi环境中更好地管理和部署。Drools是一个强大的业务规则管理系统,它允许开发人员以声明式方式编写规则,以实现复杂的业务逻辑。而OSGi则是一...
7. **调试与日志**:熟悉在OSGi环境中如何进行调试,以及如何配置和使用日志服务来记录bundle的运行情况。 8. **动态性与版本管理**:理解OSGi的动态性,如何在运行时更新和替换bundle,以及版本管理的重要性,如何...
Web应用负责Web交互,四个bundle中,一个是Web bundle,另外两个(local time service bundle和utc time service bundle)分别实现获取本地时间和世界标准时间的接口服务。 - 结构原理:Web容器注册Struts OSGi监听...
`ext.bundle.osgi.common`部分则专注于在Gradle环境中实现对OSGi规范的支持,使得Android开发者能够在构建过程中轻松处理OSGi相关的配置和依赖管理。 接着,我们来谈谈`gradle-android-plugin.zip`,这是一个专门为...
3. Maven与OSGi的结合:在OSGi环境中,Maven可以帮助管理模块的依赖关系,将JAR文件打包为OSGi兼容的bundle。Maven的BND插件或Apache Felix Bundle Plugin就是用来将Maven项目转换为OSGi bundle的工具。通过这些插件...