- 浏览: 1170032 次
- 性别:
- 来自: 火星郊区
-
博客专栏
-
-
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倍效率”开发者
最好的入门材料:
这里还有用Webex产品录制的OSGi
的简单培训 OSGiInAction
当前的开源社区对OSGi
支持的基本情况是:
1. OSGi R4 core framework specification 2. Equinox latest Release3.2.2 3. Spring-OSGi 1.0 M2 4. The Felix 0.8.0-incubator release is now available in Apache. 5. Knopflerfish 2.0.1 released
OSGi 的特别适用于对于热插拨有强烈需求的系统,同时适合经常有系统模块的增加和删除的系统。如果你的系统没有上面的两种需求的一种,建议当前不要用OSGi 。当然这个不是定论,只是我的个人研究结果,原因如下:
1. OSGi 还没有成熟到象Spring那样,出现问题后,社区支持没有Spring那么多。
2. OSGi 因为要做到热插拨,所以采用了每个Bundle用自己的ClassLoader
在其Spec中有专门的章节讲述其ClassLoader的实现原理。但是当涉及到ClassLoader,我们必须面对一些我们不愿看到的事实, 实际上Java中ClassLoader的策略和管理上比较混乱。导致当前Java开源很多的Framwork和lib都有自己的 ClassLoader。如果我们的系统不用Spring,Log4J之类的框架,全部是自己的代码的话,是没有太多的问题。可以当你要引用第三方的库之 后,就要面对因为ClassLoader不同,而资源不能共享的问题。 Apache Commons Logging的Thread classloader的本来的目的是想在不同的线程能用不同的log4j配置文件,但是把Apache Commons Logging 引入 到OSGi 中就出现了问题,所以才有网上热烈讨论的SLF4j的解决方案。
仅管Spring-OSGi 已经提出了针对ClassLoader问题的解决方案,但是并没有纳入到OSGi 的标准中。就当前形势看OSGi 更倾向于实现自己的一套Bundles的解决方案,包括log, IoC,http, servlet。至今还没有考虑怎么兼容其它已经存在的类库的问题。
3. OSGi R4的Declare Service还不够强
OSGi R4的提出了一个Declare Service的Bundle,类似于Spring IoC的机制,目的是为了减少OSGi 的 侵入性,因为在R3时,用户必须用代码的方式注册Service和引用Service。 R4只要编写一个component的xml文件将现有的类声明为Service。而且不需要强制性实现接口,这是一个很好的趋势。只是还没有做到更好。 因为没有做到象Spring IoC那么强大,DS所支持的properites只是基本类型,还不能象spring那样直接注入bean。 <property name=”domain” ref=”domainBean”/>。不过希望总是有的,Spring-OSGi 的提出就是为了解决这些问题的。只是一个正式项目用Spring-OSGi 的M2版,似乎有些不可控的风险。这些项目都在发展...
4. Eclipse对OSGi 的开发还有些小问题
Eclipse本身尽管是用OSGi 作核心的,但是对OSGi 的开发的支持还是有一些小问题的。比如对封闭 jar包 的bundle,在IDE的工程中其它的bundle就不能识别。只能将jar包 解开为classes,然后再放到bundle中才行。
问题虽小,便是却很烦人。
但是上面的问题现在都已经有一定的解决方案,而且OSGi 在发展中,所以在OSGi R5中可能都会得到很好解决
下面和大家分享一下尝试的成功心得和失败经验:
因为当时是想在正式项目中应用OSGi ,所以不是写几个Test的那种尝试,愿能给大家一点帮助
1. 环境准备
我选择的环境比较大众化。
Eclipse3.3M6(使用最新的,是想看看对OSGi 的支持有没有更好一点,其实用Eclipse3.2.2也是一样的), Equinox OSGi R4
2. 最好的入门资料
3. 了解Eclipse的OSGi 的开发环境
1) 先建立自己的我们的OSGi 运行环境。建立根目录,且定为D:\osgi \ 建立如下图的目录和文件。startup.jar是从Eclipse安装目录copy过来的。其实这个目录结构和Eclipse的安装目录结构是一样的。
Backup.bat是在windows下的启动脚本,其内容是: java -jar startup.jar –console
然后在Eclipse安装目录plugin子目录中copy下列OSGi 运行的基本jar包 到D:\osgi \plugins
org.eclipse.osgi _3.2.2.R32x_v20070118.jar
org.eclipse.osgi .services_3.1.100.v20060601.jar
再到http://download.eclipse.org/eclipse/equinox/drops/R-3.2.2-200702121330/index.php
去下载declare service bundle实现以及log实现。
org.eclipse.equinox.log_1.0.1.R32x_v20060717.jar
org.eclipse.equinox.ds_1.0.0.v20060601a.jar
同样copy到D:\osgi \plugins
接下来我们来配置文件。
配置文件为D:\osgi \configuration\config.ini
将其内容写为
#Configuration File #Mon Apr 23 09:17:19 CST 2007 osgi .clean=true osgi .console= osgi .noShutdown=true osgi .bundles=org.eclipse.osgi .services_3.1.100.v20060601.jar@start, \ org.eclipse.equinox.ds_1.0.0.v20060601a.jar@start, \ org.eclipse.equinox.log_1.0.1.R32x_v20060717.jar @start osgi .bundles.defaultStartLevel=4 osgi .framework=plugins/org.eclipse.osgi _3.2.2.R32x_v20070118.jar osgi .configuration.cascaded=false eclipse.ignoreApp=true eof=eof
针对这个配置文件需要说明几点:
1. 每个key的含义网上已经有资料说明 2. osgi .bundles中声明多个jar的时候,如果需要换行要加 “\”。这个网上一些资料没有说明,害我折腾了老半天。 3. osgi .console,一般情况下空着,表示启动后就进入console模式。 如果填入一个prot号,表示是telnet的port。这个时候OSGi 进入telnet服务模式,用户可以用telnet来进行访问。 网上有人说用Equinox不能进入后台模式,而改用了Knopflerfish, 可能是不知道这种配置的作用吧,我已经在Linux下做过测试,用nohup ./backup.sh & 可以正常运行。 4. 还有一点就是对orgi.bundles配置时,bundle的声明顺序要注意。在同一级别的起动情况下, 请将越基础的bundle越声明在前面。因为我们不可能将启动顺序完全依赖于startLevel。
OK,运行backup.bat你应该会进入OSGi 的控制台。我们的自己的OSGi 环境已经搭建好了。
2) 将OSGi 运行目录配置到Eclipse中 Eclipse默认的OSGi 工作目录是Eclipse安装目录,所以我们需要配置Eclipse使其指向我们自己的OSGi 目录(D:\osgi \) 菜单Window/Preferences
Eclipse会自动将D:\osgi \plugins下的bundles都加载过来。下次在plugins下的jar有增减的话,打开该页面按Relod即可。
3) 建立一个OSGi Project 不建议用Eclipse的向导来建立Project,我们的工程路径一般是cvs或是svn目录,而不是eclipse workspace。所以我摸索出的建立工程的方法如下:先用向导建一个空的bundle工程
将这个在Eclipse workspace目录下建立的工程目录copy到你工程目录下,以后作为模板目录。
且定我们的工程目录如下
D:\cvs\myproject\ \bundles\ \bundle_proejct_template\build.properties \src\ \test\ \bin\ \META-INF\MANIFEST.MF \OSGI -INF\
下次我们建立自己的项目时,第一步先copy一份bundle_proejct_template目录,
(如果有CVS目录,请将所有CVS目录清除),再将目录更名为你project的name
比如我们建了一个bundle工程起名为famework,
D:\cvs\myproject\bundles\framework\
这样一个Bundle工程就建立好了如果Eclipse没有将工程自动识别为OSGi
bundle工程的话,可以在Eclipse package Explorer 中右键后如下图。
4) 我们的项目经常会用到log包,可是Apache common logging的ClassLoader机制和OSGi 的不兼容,所以在正式项目之前,我们必须解决这个难题。我用的网上是SLF4j的解决方案。在解决之前我们必须了解一些背景,首先我们打Log,经常会用到两个jar包 , 一个是commons-loggin包,另一个是log4j包。本质上我们是可以直接用log4j包来打log的,但是为了做到兼容其它的log,比如 Jdklog,simple log等等。其实个人觉得这个在具体的一个项目内都没什么大的意义。可是一个类库,比如spring,他就不能定死为log4j。所以spring内部的 logger都是用的commons-logging的LogFactory.getLog()。来作为log的接口,而没有直接用log4j。我们可以 在设置java环境变量 “org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger” 来指定commons logging 的实现为log4j. 而SLF4j呢,又更高一层地兼容commons logging(也是就JCL),同时兼容log4j,并且没有ClassLoader问题。
5) 建立slf4j-osgi bundle project 我们没有必要写代码,只是简单地将slf4j的jar包 做一层bundle的封装,再重新打包成jar包 ,并且作为bundle发布。先按上面介绍的方法建立slf4j-osgi bundle proejct 再download slf4j,将 slf4j-api-1.3.1.jar jcl104-over-slf4j-1.3.1.jar log4j-1.2.14.jar slf4j-log4j12-1.3.1.jar copy到 D:\cvs\myproject\bundles\slf4j-osgi \lib\ 下
D:\cvs\myproject\bundles\slf4j-osgi \META-INF\ MANIFEST.MF文件内容如下
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: slflog4josgi Bundle-SymbolicName: slf.commons.logging.osgi Bundle-Version: 1.1.0 Bundle-Vendor: slf Bundle-Localization: plugin Bundle-ClassPath: bin/, lib/jcl104-over-slf4j-1.3.1.jar, lib/slf4j-api-1.3.1.jar, lib/log4j-1.2.14.jar, lib/slf4j-log4j12-1.3.1.jar Export-Package: org.apache.commons.logging, org.apache.log4j, org.apache.log4j.spi, org.apache.log4j.xml, org.slf4j Import-Package: org.osgi .framework;version="1.3.0"
D:\cvs\myproject\bundles\slf4j-osgi \build.properites文件内容如下
source.. = src/ bin.includes = bin/,\ META-INF/,\ lib/jcl104-over-slf4j-1.3.1.jar,\ lib/slf4j-api-1.3.1.jar,\ lib/log4j-1.2.14.jar,\ lib/slf4j-log4j12-1.3.1.jar
6) 将OSGi bundle工程导出为jar包 在Eclipse Project Exploer工作区,右键选择”Export…”
7) 建立一个new bundle project,以测试slf4j-osgi ,为了使这个例子有一定的意义,
我们让这个bundle可以为控制台输出一个简单命令hello。
工程目录且为
D:\cvs\myproject\bundles\test-slf4j\
package gsb.service .console ; import org.eclipse.osgi .framework.console.CommandInterpreter; import org.eclipse.osgi .framework.console.CommandProvider; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class SitesProviderConsole implements CommandProvider { private Log logger = LogFactory.getLog ( CommandProvider.class ) ; public String getHelp( ) { StringBuffer buffer = new StringBuffer ( ) ; buffer.append ( "\t sayHello – Just a test\n " ) ; return buffer.toString ( ) ; } public void _sayHello( CommandInterpreter ci) throws Exception { logger.warn ( "logger.class=" +logger.getClass ( ) .getName ( ) ) ; logger.warn ( "This is a debug log from commons log!" ) ; System .out .println ( "Hello, world!" ) ; } }
META-INF/MANIFEST.MF
… Service-Component: OSGI -INF/console.xml … Import-Package: org.apache.log4j, org.apache.commons.logging, … …
OSGI -INF/console.xml
<?xml version ="1.0" encoding ="UTF-8" ?> <component name ="SiteProviderConsoleActivator" > <implementation class ="gsb.service.console.SitesProviderConsole" /> <service> <provide interface ="org.eclipse. osgi .fram ework.console.CommandProvider" /> </service> </component>
发表评论
-
关于Felix Log Service
2012-12-07 16:44 1610OSGi服务纲要规范中定义了服务于OSGi平台的通用日志服 ... -
Maven 3 Felix 4 Eclipse 的搭建与部署(部分转载自别人文章)
2012-10-18 10:24 20764.1.开发环境搭建 4.2开发工具 Maven 3 F ... -
【绝对路径】OSGi环境中获取Plugin/Bundle中文件资源的绝对路径
2012-10-08 10:53 2546摘要:在进行Eclipse RCP开发的过程中,需要使用一 ... -
OpenCore:基于OSGi开发纯插件体系结构的WEB应用程序
2012-09-21 17:46 1443随着OSGi/Equinox逐渐成为Java EE服务端的基础 ... -
OSGi技术在Java Web开发中的应用
2012-09-20 11:26 1438随着 Java SE 对模块化功能原生支持的一再推迟(据最 ... -
OSGI典型的应用案例
2012-09-20 11:26 1659OSGI典型的应用案例主要有两个:分别是Eclipse和BMW ... -
OSGi特点
2012-09-20 11:26 12711、JRE版本无关性。虽然Java一直被人们认为是“Write ... -
OSGI与JMX 的关系
2012-09-19 17:09 1089不过重点是: JMX 本来设计的用途就只为了管理,我们不 ... -
在equinox环境开发web应用的"利器" -- registerResources()方法 详解
2012-09-19 17:07 1261registerResources()方法详解 1、简介 ... -
在equinox环境开发web应用的"利器" -- 序
2012-09-19 17:05 1390在equinox环境中开发web应用必须要借助一些工具包提供的 ... -
equinox环境下web应用资源的部署
2012-09-19 17:04 1329osgi的equinox实现环境下,web服务器和web应用都 ... -
OSGi产生的背景--在繁荣的混乱之中走出困惑
2012-09-19 16:58 1203软件的复杂性正在以惊 ... -
将web容器置于OSGi框架下进行web应用的开发
2012-09-16 14:26 3576将web容器置于OSGi框架下,其实就是将web容器做成OSG ... -
在Eclipse中开发OSGi Bundle
2012-09-16 14:26 1358Eclipse为开发OSGI Bundle提供了良好的支持,它 ... -
【第一代服务注册形式】 - 将一个Bundle注册为服务
2012-09-14 10:09 11761、创建业务接口类及其实现类 Java代码 ... -
Declarative Services规范简介及应用
2012-09-14 10:08 1451Declarative Services 是一 ... -
用FileInstall管理Bundle的动态安装、启动、卸载
2012-09-14 10:07 13571、文件目录如下: F:\study_osgi ... -
服务工厂 - Bundle消费者返回不同的服务对象
2012-09-14 10:03 1230一般情况下,服务对象在注册后,任何其它的Bundle在请求 ... -
服务跟踪(ServiceTracker)
2012-09-14 09:58 1190当多个Bundle使用同一 ... -
OSGi容器中Bundle之间Synchronous Communication
2012-09-11 17:07 1608OSGi Core定义了一个服务层,提供了一个Bundl ...
相关推荐
状态的变化是由框架控制的,例如,当启动一个bundle时,框架会解析其依赖并尝试启动所有依赖的bundle。 在实际开发中,使用OSGi工具可以简化工作流程。例如,Eclipse IDE提供了对OSGi的支持,允许开发者在集成开发...
你可以尝试修改`osgi.impl` Bundle中的代码,然后在不关闭框架的情况下更新Bundle,看看如何反映到运行的应用中。 8. **打包与部署** 最后,了解如何将这些Bundle打包成可部署的格式,如BND或ZIP文件,以便在不同...
OSGI(Open Services Gateway Initiative)是一种开放标准的Java模块化系统,它允许开发人员将应用程序...实践是检验理论的最好方式,所以动手尝试创建和管理自己的OSGI bundle,将会极大地提升你对这个框架的理解。
OSGI(Open Services Gateway Initiative)是一种开放的标准框架,主要用于创建模块化、动态和可扩展的Java应用程序。...记住,实践是检验理论的最好方式,动手尝试这些例子,你将更深入地理解OSGI的魅力。
实践是学习OSGI的最佳途径,尝试创建自己的bundle并与其他bundle通信,将会使你对OSGI有更深入的理解。 总的来说,OSGI提供了一种强大的方式来组织和管理Java应用程序,使其更加灵活和可维护。通过本教程中的实例,...
2. **分析源码**:如果日志没有提供足够的线索,可以尝试查看OSGi框架和Glassfish的相关源代码,理解异常的具体原因。 3. **检查捆绑包**:确认所有依赖的捆绑包都已正确安装且符合版本要求,确保它们的元数据...
在该模型下,当一个ClassLoader收到加载类的请求时,它首先会委托父加载器去尝试加载,只有当父加载器无法加载时,当前加载器才会尝试自己加载。这样设计避免了类的重复加载,并确保了核心类库的唯一性。 四、...
当用户尝试登录时,这个bundle会与LDAP服务器通信,查询用户提供的用户名和密码是否匹配存在于目录服务中的记录。这种方式适用于大型组织,因为它可以集成到现有的用户管理系统中,提供集中化的身份验证。 3. **...
还可能遇到权限问题,如"AccessControlException",因为尝试访问受保护的MBean操作而没有足够的权限。 解决OSGI错误通常涉及以下几个步骤: 1. **日志分析**:查看OSGI容器的日志,如Equinox或Felix的日志,找出...
《Carrot-OSGi-Annotation-SCR-Make:探索开源项目的OSGI...对于那些涉及OSGi服务组件开发的项目,它无疑是一个值得尝试的利器。同时,该项目的开源性质也鼓励了社区的参与和共享,进一步推动了OSGi技术的普及和发展。
当需要加载类时,会遵循经典的委托模型,即先尝试从父ClassLoader加载,若未找到再在当前ClassLoader中查找。 #### Bundle类共享机制 类的共享通过在`MANIFEST.MF`文件中定义`Require-Bundle`、`Import-Package`、...
- 完成以上步骤后,可以尝试编译 CVM。 #### 三、CVM 的使用与测试 完成 CVM 的编译后,接下来可以将其部署到 ARM Linux 上,并进行简单的测试。 **部署步骤**: 1. 将编译好的 `phonemejavacvmbin` 目录复制到...
标题中的"OSGI-ROOT.rar"表明这是一个与OSGi(Open Service Gateway Initiative)相关的压缩文件,通常包含了OSGi框架...如果需要更深入的了解,可以尝试下载并解压文件,查看其中的源码和工具,结合博客文章进行学习。
最后,实践是最好的老师,尝试编写一些简单的OSGi应用,亲自动手实现服务注册、查找等功能,这将极大地加深对OSGi的理解。 通过以上介绍,我们可以看到OSGi 4.3.0规范不仅为Java开发者提供了一个强大且灵活的模块化...
在提供的部分内容中,我们得以窥见文章详细介绍了如何搭建一个基础的OSGi工作环境,这对于初次尝试OSGi的开发者来说是至关重要的。 文章首先提到,建立OSGi环境的首要步骤是选择一个OSGi框架。目前有三个开源实现可...
在处理Bundle时,开发者需要注意异常处理,例如,当尝试启动或停止一个Bundle时,可能会遇到IOException或BundleException等异常情况。因此,合理地管理这些异常情况对于开发稳定的模块化应用至关重要。 Eclipse ...
当多个Bundle依赖于不同版本的同一包时,OSGi会尝试解决冲突。默认策略是使用最高版本的包,但开发者也可以自定义策略,如使用最低版本或者指定特定版本。 八、工具支持 在实际开发中,工具的使用可以极大地简化...
"kamon-osgi"项目正是为了解决这个问题,尝试使Kamon与OSGI能够和谐共存。 该项目由两个主要插件组成: 1. **extKamon**:这是一个关键组件,它的任务是持有Kamon库,并负责导出Kamon所需的所有包。在OSGI环境中,...