- 浏览: 1152644 次
- 性别:
- 来自: 火星郊区
博客专栏
-
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倍效率”开发者
Equinox 在创建 Bundle 的 ClassLoader 时,首先获取 bundle 的 classpath ,然后执行 createBCLPrevileged 方法,此方法最后转交由 BaseData 来创建 ClassLoader 。
BaseDate创建ClassLoader的关键代码片段为:
在Equinox中,默认的情况下adaptor.getBundleClassLoaderParent返回的为bootstrap classloader,可通过修改启动的osgi.parentClassLoader 来改变这个parent classloader,
osgi.parentClassLoader 的可选值有四个,分别是:
l boot : 默认
l app : SystemClassLoader
l ext : SystemClassLoader 的 parent
l fwk : 启动 Equinox 的 ClassLoader
ClassLoadingHook在createClassLoader的时候都没有做动作,因此最后ClassLoader都是通过创建 DefaultClassLoader对象来构建的,其中parent参数为null,delegate参数为BundleLoader实 例,bundleclasspath参数为bundle的classpath。
经过以上步骤后,完成了ClassLoader的创建,可以开始加载class了,根据上面上述,Bundle的Class就由DefaultClassLoader来完成了。
查看DefaultClassLoader的loadClass代码,发现真正的加载class的过程是转为调用了delegate 的 findClass来完成的,delegate参数对应的为BundleLoader实例,转为跟踪BundleLoader的findClass方法。
BundleLoader的findClass方法的代码片段:
从以上这个代码片段,可以看到,Equinox将java.开头的类转交给了parent classloader去加载,这也意味着没必要在系统中提供对外export java.开头的package。
如果不是java.开头的类,则交由findClassInternal方法来完成加载。
findClassInternal方法遵循的为OSGi规范中定义的Class的加载顺序,不过仍然稍有改动:
1) 判断是否交由 parent classloader 去完成加载
在启动Equinox时,Equinox会读取org.osgi.framework.bootdelegation属性,该属性对应配置的为需要 从parent classloader中加载的package,如值配置的为*,说明所有的都从parent classloader中加载 ,如值配置的为具体的package,那么则放入bootDelegation集合;如配置的为带通配符的 package,那么则放入bootDelegationStems集合。
判断时Equinox首先判断是否所有的都从parent classloader中加载,如是则从parent classloader中加载;
如需要加载的类的package位于bootDelegation或bootDelegationStems集合中,那么同样从parent classloader中加载。
如不从parent classloader中加载,则进入下面的步骤。
2) 尝试调用 Equinox 提供的 ClassLoaderDelegateHook 的扩展来加载
Equinox对外提供了ClassLoaderDelegateHook的接口扩展,可编写ClassLoaderDelegateHook的实现,注册到Framework中,那么当有Class需要加载等动作时都会得到通知。
在默认情况下,Equinox中没有ClassLoaderDelegateHook的实现,因此继续下面的步骤。
3) 判断是否在 import-package 中,如在则交由相应的 PackageSource 去加载
根据Bundle配置的import-package,判断目前需要加载的类是否在import-package中,如在则交由对应的 PackageSource进行加载,PackageSource在加载时即直接交由对应的Bundle的classloader去加载,如加载的类的 package在import-package中,但加载后仍然没有找到Class,则直接抛出ClassNotFoundException,如加载 到,则直接返回。
如所需要加载的类的package不在import-package中,则继续下面的步骤。
4) 尝试从 require-bundle 中加载
尝试使用require-bundle来加载,如加载到,则直接返回,如加载不到,则继续下面的步骤。
5) 尝试从当前 Bundle 中加载
直到经过以上步骤的尝试,才尝试由当前Bundle中加载,当前Bundle加载的方法即从Bundle-Classpath或当前Bundle的 Fragment中查找相应名称的class文件,并读取该文件进行加载,如class文件已加载,则进行缓存,再次加载时则不需要查找和解析class 文件。
如从当前Bundle中仍然未找到所需的类,则继续下面的步骤。
6) 尝试从 DynamicImport-Package 中加载
判断需要找的类的package是否在DynamicImport-Package中,如果在,则交由相应的PackageSource进行加载, 如PackageSource中加载不到,则抛出ClassNotFoundException;如不在DynamicImport-Package中, 则继续下面的步骤。
7) 再次尝试调用 Equinox 提供的 ClassLoaderDelegateHook 的扩展来加载
这步和第2)步相同,因此在默认情况下继续下面的步骤。
8) 尝试使用 eclipse 的 buddy 机制来加载
Buddy机制是Eclipse的扩展,并不符合OSGi规范,因此在此不做深入分析。
9) 判断一定的条件,如符合则从 parent classloader 中加载
判断的条件为:parent classloader不为null、不从parent classloader中加载、Equinox的向后兼容属性(osgi.compatibility.bootdelegation)为true以及 jvm的bug class,如满足以上条件,则尝试从parent classloader中加载。
如经过以上所有步骤后,仍然未找到需要加载的class,则抛出ClassNotFoundException。
从上面的代码分析
中,在Equinox中可以通过osgi.parentClassLoader、org.osgi.framework.bootdelegation来
控制从Bundle
ClassLoader外来加载Class,这对于集成Equinox其他容器而言,非常有用,另外,还可以通过实现
ClassLoaderDelegateHook来改变Class的加载。
发表评论
-
关于Felix Log Service
2012-12-07 16:44 1574OSGi服务纲要规范中定义了服务于OSGi平台的通用日志服 ... -
Maven 3 Felix 4 Eclipse 的搭建与部署(部分转载自别人文章)
2012-10-18 10:24 20404.1.开发环境搭建 4.2开发工具 Maven 3 F ... -
【绝对路径】OSGi环境中获取Plugin/Bundle中文件资源的绝对路径
2012-10-08 10:53 2510摘要:在进行Eclipse RCP开发的过程中,需要使用一 ... -
OpenCore:基于OSGi开发纯插件体系结构的WEB应用程序
2012-09-21 17:46 1426随着OSGi/Equinox逐渐成为Java EE服务端的基础 ... -
OSGi技术在Java Web开发中的应用
2012-09-20 11:26 1418随着 Java SE 对模块化功能原生支持的一再推迟(据最 ... -
OSGI典型的应用案例
2012-09-20 11:26 1639OSGI典型的应用案例主要有两个:分别是Eclipse和BMW ... -
OSGi特点
2012-09-20 11:26 12561、JRE版本无关性。虽然Java一直被人们认为是“Write ... -
OSGI与JMX 的关系
2012-09-19 17:09 1064不过重点是: JMX 本来设计的用途就只为了管理,我们不 ... -
在equinox环境开发web应用的"利器" -- registerResources()方法 详解
2012-09-19 17:07 1239registerResources()方法详解 1、简介 ... -
在equinox环境开发web应用的"利器" -- 序
2012-09-19 17:05 1370在equinox环境中开发web应用必须要借助一些工具包提供的 ... -
equinox环境下web应用资源的部署
2012-09-19 17:04 1311osgi的equinox实现环境下,web服务器和web应用都 ... -
OSGi产生的背景--在繁荣的混乱之中走出困惑
2012-09-19 16:58 1172软件的复杂性正在以惊 ... -
将web容器置于OSGi框架下进行web应用的开发
2012-09-16 14:26 3546将web容器置于OSGi框架下,其实就是将web容器做成OSG ... -
在Eclipse中开发OSGi Bundle
2012-09-16 14:26 1337Eclipse为开发OSGI Bundle提供了良好的支持,它 ... -
【第一代服务注册形式】 - 将一个Bundle注册为服务
2012-09-14 10:09 11581、创建业务接口类及其实现类 Java代码 ... -
Declarative Services规范简介及应用
2012-09-14 10:08 1424Declarative Services 是一 ... -
用FileInstall管理Bundle的动态安装、启动、卸载
2012-09-14 10:07 13351、文件目录如下: F:\study_osgi ... -
服务工厂 - Bundle消费者返回不同的服务对象
2012-09-14 10:03 1210一般情况下,服务对象在注册后,任何其它的Bundle在请求 ... -
服务跟踪(ServiceTracker)
2012-09-14 09:58 1164当多个Bundle使用同一 ... -
OSGi容器中Bundle之间Synchronous Communication
2012-09-11 17:07 1566OSGi Core定义了一个服务层,提供了一个Bundl ...
相关推荐
每个OSGi模块(Bundle)都是一个独立的JAR文件,有自己的类加载器,遵循特定的MANIFEST.MF规范。 2. **Equinox环境搭建**:首先,需要安装Eclipse IDE,然后通过Eclipse的插件管理器安装OSGi开发所需的Equinox SDK...
OSGi提供了一套API用于操作这些状态,使得开发者可以在程序运行时动态地加载或卸载Bundle,从而实现系统的灵活性和扩展性。例如,使用`start`和`stop`命令可以轻松地控制Bundle的状态。 **服务层(Service Layer)*...
通过`Class`类的`forName()`方法加载类,然后使用`newInstance()`创建对象,或者通过`getMethod()`和`invoke()`执行特定方法。 2. **Java Service Provider Interface (SPI)**: Java SPI是一种用于服务发现和加载...
- `target`或`build`:构建输出目录,可能包含编译后的class文件和打包好的bundle JAR 要深入理解并运行这个OSGi demo,你需要: 1. 安装合适的OSGi运行时环境,如Apache Felix或Eclipse Equinox。 2. 解压`app01`...
它们都实现了OSGi服务规范,提供了Servlet 3.0或更高版本的支持,使得可以直接在OSGi Bundle中注册Servlet。 3. **创建OSGi Bundle** 使用Maven或Gradle等构建工具,创建一个新的OSGi Bundle项目。确保在pom.xml或...
通过以上步骤,我们不仅实现了 OSGi Bundle 的基本功能,还成功地将 Spring 框架集成到了 Bundle 中。这样的整合使得 Bundle 能够更好地利用 Spring 的特性,如依赖注入和面向切面编程,从而构建更加灵活、可扩展的...
- **类加载机制**:每个bundle有自己的类加载器,通过特定机制加载其他bundle中的类。 #### JVM调优实践 - **调优工具**:如VisualVM、JProfiler等。 - **案例分析**:例如通过监控发现频繁的Full GC导致性能瓶颈,...
- **额外的Bundle**:在测试运行时,还需要启用特定的Bundle,如`jcl104.over.slf4j`、`org.eclipse.equinox.http`等。 #### 三、Spring-DM Bundle配置 Spring-DM Bundle的配置主要包括以下几个方面: 1. **`...
在Spring-DM Bundle中,可以在`META-INF/spring/`目录下放置Spring配置文件,所有位于该目录下的XML文件都会被默认加载。 **示例配置**: ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:...
OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序按需加载和卸载组件,实现动态的、可插拔的架构。Jetty是一款轻量级、高性能的HTTP服务器和Servlet容器,它能够直接在OSGi...
在这些类中,你可以使用`@RunWith(SpringJUnit4ClassRunner.class)`注解来表明测试需要Spring Test的支持。 3. **定义测试上下文**:使用`@ContextConfiguration`注解来指定包含被测试组件的Spring配置文件。这样,...