- 浏览: 128310 次
- 性别:
- 来自: 北京
最新评论
-
C_J:
有必要这么鸡冻咩?
编写自己的ClassLoader知识点 -
jason61719:
你这不是说了等于没说吗……就解析个loadClass(),谁不 ...
编写自己的ClassLoader知识点 -
jiming:
tedeyang 写道很好的改进,不过话说回来,mybatis ...
开源,从关注产品社区做起(ibatis3.x的最近一个issue展示) -
C_J:
独爱Java 写道好像实际用处并不是很大,只是多了解了有这个东 ...
Java内存模型笔记 -
独爱Java:
好像实际用处并不是很大,只是多了解了有这个东西而已。。。
Java内存模型笔记
记得以前工作的时候,有天direct manager问我在tomcat下的应用A要使用应用B下的某个类,我告诉他是不行的,因为JDK对于类加载有命名空间,不同的命名空间之间相互不影响,即使类名相同,这也为了JVM的安全着想,所以tomcat为应用A和应用B都创建了各自类加载的命名空间从而相互不影响。
而OSGi的设计理念看上就是把各种功能及服务做成Bundle并热拔插。换句话说,应用A,B此时被当作组件存活在OSGi平台上,B中的某个类可以公开出去,让其他组件可见,或者B中的某个类实例注册到OSGi容器中(类似解耦的方式之一),这样应用A就可以类似组件一样使用应用B中的资源了。
这种模块化和热拔插的设计理念最流行的应用应该算eclipse吧,eclipse plugin就是这样加载模块化的方式,我觉得还是不错的,给我最爽的感觉就是一个应用的功能基本上都是由不同的人不同时间以组件方式被挂载到eclipse平台上面。
其实,在自己的开发工作当中也是分模块实现应用不同的功能,并因为需求是变化的,说不定哪天XX需求就不要了,要新增YY需求,为了不修改过多的代码,保持开闭原则,所以在coding的时候也是非常注意模块化设计,并达到模块的可配置性。但那只是代码级别上的模块化,代码级别的好处是模块和模块之间的相互调用非常方便,适用于有一定耦合度的情况,而OSGi貌似实现了一个JVM层面的模块化,模块与模块之间如果要耦合的话,需要以上提到的export或注册。
如果app应用比较单一,感觉就没必要了,有点大题小做。当然,如果建立这样的平台很轻松的话,又未尝不是一种新的尝试。
那如何基于OSGi平台开发应用app呢?
在网上找到一篇简单的应用:http://blog.csdn.net/zouzhile/archive/2010/01/03/5124243.aspx
建立的Bundle是建立在felix框架上,所需要的软件:
==================================================================================
Eclipse:3.3.1
Felix binary:http://labs.xiaonei.com/apache-mirror/felix/felix-framework-2.0.1.zip
Felix 源代码:http://download.csdn.net/source/1958471
BND 编辑器:http://www.aqute.biz/repo/biz/aQute/bnd/0.0.384/bnd-0.0.384.jar
注释:1)BND编辑器是一个很轻的工具,能够帮助我们从.bnd文件自动在Eclipse中生成Bundle的jar文件
==================================================================================
详细的步骤请参见原作者的博客。
自己只写了一个简单的helloworld测试了下,如下:
package org.osgi.helloworld; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class HelloWorld implements BundleActivator{ static { System.out.println("in static"); } public static ExecutorService excutor=Executors.newFixedThreadPool(1); public void start(BundleContext arg0) throws Exception { System.out.println("start"); excutor.execute(new oneThread()); } public void stop(BundleContext arg0) throws Exception { System.out.println("stop"); excutor.shutdown(); } class oneThread implements Runnable{ public void run() { System.out.println("Working...."); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
写完app后,就需要利用bnd工具打包成一个jar,并符合OGSI的Bundle规范,然后加载到felix这个容器里,详细步骤请见上面博客。
然后启动felix的shell脚本,如下:
java -jar felix.jar [felix-cache-path] Welcome to Felix ================ -> ps START LEVEL 1 ID State Level Name [ 0] [Active ] [ 0] System Bundle (2.0.1) [ 1] [Active ] [ 1] Apache Felix Bundle Repository (1.4.2) [ 2] [Active ] [ 1] Apache Felix Shell Service (1.4.1) [ 3] [Active ] [ 1] Apache Felix Shell TUI (1.4.1) -> install file:src/helloworld.jar // app打成的jar包 Bundle ID: 6 -> start 6 // 运行helloworld in static start -> Working.... -> stop 6 // 停止helloworld stop ->
从结果看,还是挺吸引人的,实现了模块的热拔插,程序由原来的main()入口变为了start(),模块退出时,则调用stop()方法。
但整个过程Console只输出一次“Working”字样。
打成的jar包结构也很简单:
meta-inf
/manifest.mf
org/
osgi/
helloworld/ *.class
其中mf为osgi的元数据描述文件,如下:
Manifest-Version: 1.0
Private-Package: org.osgi.helloworld
Bundle-Version: 0
Tool: Bnd-0.0.384
Bnd-LastModified: 1287414214125
Bundle-Name: helloworld
Bundle-ManifestVersion: 2
Created-By: 1.6.0-beta2 (Sun Microsystems Inc.)
Bundle-Activator: org.osgi.helloworld.HelloWorld
Import-Package: org.osgi.framework;version="1.5"
Bundle-SymbolicName: helloworld
到此我体验到了在一个JVM里模块以jar形式实现的热拔插,OSGi还有个特色是这些Bundle之间如何实现类共享呢?
关于felix的使用,截取官方的一点文字:
Starting the Framework
Start the framework from the installation directory by typing:
java -jar bin/felix.jar
The framework launcher starts the framework and installs and starts all bundles contained in the bundle directory of the current directory. By default, the bundle directory contains shell-related bundles providing a textual user interface to interact with the framework. Bundles installed into the framework are copied into a bundle cache directory for subsequent executions. By default, the framework creates a cache directory, called felix-cache, in your current working directory. If you want to start the framework using a different bundle cache directory, you can do so like this:
java -jar bin/felix.jar <cache-path>
Where <cache-path> is the path you want to use as the bundle cache. If you specify a relative cache path, then it will be treated as relative to the current working directory.
Installing Bundles
A bundle is the OSGi term for a component for the OSGi framework. A bundle is simply a JAR file containing a manifest and some combination of Java classes, embedded JAR files, native code, and resources. A bundle may provide some specific functionality for the user or it may implement a service that other bundles can use; bundles can only use functionality from other bundles through shared services and packages.
The Felix framework distribution comes with three bundles, which are located in the bundle/ directory of the framework distribution installation directory. These bundles include the Gogo Runtime (core command processing functionality), Gogo Shell (text-based shell user interface), Gogo Command (basic set of commands), and Bundle Repository (a bundle repository service). In addition to these bundles, the bundle repository provides access to other bundles for easy installation. The bundle repository service provides a set of shell commands in the obr:* scope; refer to the Apache Felix OSGi Bundle Repository for more information.
Before installing any bundles, it is important to understand how bundles are manually deployed into the framework. Bundles are deployed in two stages; first they are installed, then they are started. To install a bundle use the felix:install shell command followed by a bundle URL. For example, to install a bundle.jar bundle you type:
felix:install file:/path/to/bundle/bundle.jar
Once a bundle is installed, it can then be started by using the felix:start command and the bundle identifier of the desired bundle. The felix:lb command is used to list installed bundles and to obtain the bundle's identifier. The following Felix shell session illustrates how to start the bundle.jar bundle:
g! install file:/path/to/bundle/bundle.jar
ps:附件是eclipse的实例代码
- osgi.rar (758.1 KB)
- 下载次数: 85
发表评论
-
iOS入门(ongoing)
2012-09-13 11:32 1310Record it: The overview of ... -
Stuff about Android
2011-07-09 16:15 1073Foreword: long time ... -
JQuery初体验(Demo)
2011-05-22 13:43 1463Demo:Show <meta content ... -
Java内存模型笔记
2011-04-13 15:48 1543题记: 看到C/C++ ... -
Radiant_The Popular Ruby's CMS Demo篇
2011-04-02 14:49 1249题记: 上篇 记录我第一次安装Rodiant经过和 ... -
Radiant_The Popular Ruby’s CMS安装篇
2011-03-28 00:48 1285题记: 今天第一次参加JE的线下活动,robbin等 ... -
关于Azul 并发垃圾回收器
2011-03-26 14:40 1325题记: 总感觉JE讨论的帖子的东西都比较滞后,所以会 ... -
phpCMS & jQuery是我该做的(阉割了)
2011-02-27 23:02 81WD讲究以plugin挂载为结构,我需要构造一个p ... -
我的玩意:J2ME的Criteria初探
2011-01-20 21:59 1025题记: 前几天跟初中同学聊天,他问我能不能做一个GP ... -
编写自己的ClassLoader知识点
2011-01-13 14:41 1876题记: 看到InfoQ关于ClassLoader的文 ... -
周末好玩,用短信控制你的计算机
2011-01-10 16:34 3005Snapshot: 详情 ... -
About Dock Plugin on Mac
2010-11-21 22:47 1470题记: 第一次接触MAC的开发..... ... -
可变hashcode的隐患和序列化安全
2010-10-25 00:55 1379可变hashcode的隐患 为识别对象,JDK ... -
MongoDB on DAO with Java Language
2010-08-26 19:17 1436A Quick Tour Using the Java d ... -
Getting Start on Mongodb
2010-08-26 01:29 1519题记: 最近老和同学聊到non-relational ... -
Java Media Framework本地玩转摄像头
2010-08-04 00:57 17451、简介The JavaTM Media Framework ... -
从WeakLogHandler应用看Java的引用、引用队列
2010-06-14 00:58 1505题记: 前几天讨论到WeakHashMap(这个是个弱引用的 ... -
《重构》读书笔记
2010-05-09 00:05 1053Martin Fowler于2003年出版 ... -
RPC之WebServices&RMI&JMS,phprpc框架?(待续)
2010-05-06 22:31 55前段时间写过基本的WebServices,也没再做深入 ... -
Java应用中的SQL注入攻击和防范
2010-04-24 01:06 6727说说自己对注入的 ...
相关推荐
例如,`org.eclipse.osgi.framework.internal.core.BundleHost`类负责管理bundle的启动和停止,`org.eclipse.osgi.framework.eventmgr.EventAdmin`则展示了OSGi事件模型的实现。 五、应用场景 OSGi在许多领域有着...
org.jbundle.util.osgi.wrapped.org.apache.http.client-4.1.2.jar
org.osgi.namespace.extender-1.0.1.jar
org.apache.axis2.osgi-1.5.jar
osgi的jar包,第一次上传,有需要的可以自取,联网下载很慢,希望对你们有帮助,偶然间遇到了
标题中的"org.osgi.framework.BundleException-glassfish"指的是在使用Glassfish应用服务器时遇到的OSGi框架相关的异常。OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它允许动态地管理和部署...
《Atlassian Plugins OSGi 2.6.0.jar - 深入理解与应用》 Atlassian Plugins OSGi 2.6.0.jar 是一个重要的组件,它结合了Atlassian的产品生态与OSGi(Open Service Gateway Initiative)框架的优势。OSGi是一种模块...
标签:asm-3.1-osgi.jar.zip,asm,3.1,osgi,jar.zip包下载,依赖包
maven-osgi-0.1.0.jar
jolokia-osgi-1.1.5.jar
com.springsource.org.apache.commons.dbcp-sources-1.2.2.osgi.jar源码 jar包
在ubuntu软件中心安装的eclipse启动存在异常,需要在plugins中加入这个文件才能正常启动
atlassian-plugins-osgi-2.6.0.jar
标题中的"ant-1.6.5-osgi.jar.zip"是一个压缩文件,它包含了两个主要元素:ant-1.6.5-osgi.jar和ant.license.txt。这个压缩包是针对Apache Ant的一个版本,具体是1.6.5版本,并且与OSGi(Open Service Gateway ...
org.osgi.namespace.contract-1.0.0.jar
org.osgi.namespace.implementation-1.0.0.jar
org.osgi.namespace.service-1.0.0.jar
asm-1.3.3.jar, asm-1.3.4.jar, ...asm-3.1-osgi.jar, asm-3.1.jar, asm-3.2-sources.jar, asm-3.2.jar, asm-3.3.1.jar, asm-3.3.jar, asm-4.0_RC1.jar, asm-5.0.3.jar, asm-5.1.0-M5.jar, asm-util-2.2.2.jar
cxf插件使osgi能够发布webService
org.springframework.osgi.extensions.annotation-1.2.1.jar