`

OSGi使用小结

    博客分类:
  • OSGi
阅读更多
最近使用OSGi来解决一个集成测试的问题. 感觉还是走了不少弯路, 主要是OSGi的一些习惯思维跟以前的开发思想有一定的区别(主要集中在ClassLoader), 另外一点就是当出现一些莫名其妙的问题, 一般很难知道原因, 需要从出错信息的蛛丝马迹中根据经验进行推理(汗,程序员看推理小说对解决问题很有帮助啊).

本人使用的eclipse版本是3.5.x, 只用到了equinox框架, 使用了里面最简单的功能. 什么spring-dm之类的仅限于hellworld.

org.eclipse.equinox.ds_1.1.1.R35x_v20090806 eclipse是自带的, 不用再下载了
还需要加入org.eclipse.equinox.util_1.0.100.v20090520-1800这个bundle

一个完整的servlet container(jetty)的bundle列表:
引用
0 ACTIVE      org.eclipse.osgi_3.5.1.R35x_v20090827
1 ACTIVE      org.mortbay.jetty.server_6.1.15.v200905151201
2 ACTIVE      org.eclipse.osgi.services_3.2.0.v20090520-1800
4 ACTIVE      org.eclipse.equinox.http.servlet_1.0.200.v20090520-1800
5 ACTIVE      org.eclipse.equinox.http.jetty_2.0.0.v20090520-1800
9 ACTIVE      org.apache.commons.logging_1.0.4.v200904062259
10 ACTIVE      javax.servlet_2.5.0.v200806031605
11 ACTIVE      org.mortbay.jetty.util_6.1.15.v200905182336
12 ACTIVE      org.eclipse.equinox.ds_1.1.1.R35x_v20090806
13 ACTIVE      org.eclipse.equinox.util_1.0.100.v20090520-1800
3 ACTIVE      LocalDictQuery_1.0.0
6 ACTIVE      RemoteDictQuery_1.0.0
7 ACTIVE      DictQueryWeb_1.0.0
8 ACTIVE      DictQuery_1.0.0


spring-dm需要的bundle列表:
引用
0 ACTIVE      org.eclipse.osgi_3.5.1.R35x_v20090827
1 ACTIVE      org.springframework.osgi.core_1.2.0
2 ACTIVE      org.springframework.context_2.5.6.A
3 ACTIVE      org.springframework.aop_2.5.6.A
4 ACTIVE      org.springframework.beans_2.5.6.A
5 ACTIVE      org.springframework.osgi.extender_1.2.0
6 ACTIVE      com.springsource.org.aopalliance_1.0.0
7 ACTIVE      org.springframework.core_2.5.6.A
8 ACTIVE      org.springframework.osgi.io_1.2.0
9 ACTIVE      org.apache.commons.logging_1.0.4.v200904062259


osgi bundle的文件路径一般是这样:
引用
bundleresource://15.fwk21010507:1/


将osgi bundle工程使用bundleresource协议的文件URL转换成使用file协议的URL以便读取
url = org.eclipse.core.runtime.FileLocator.toFileURL(url);

这里需要用到org.eclipse.core.runtime 这个bundle

osgi 的bundle工程, 需要将maven依赖jar包copy到target目录, 可以使用下面的命令:
引用
mvn dependency:copy-dependencies -DoutDirectory=/target/dependency


通过在bundle中通过ClassLoader.getSystemResource("")的起始路径在:
引用
D:/eclipse/eclipse-java-galileo/plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar


碰到最多的是类似的错误:
引用
java.lang.LinkageError: loader constraint violation: when resolving interface method "package.class.method(JLpackage/class;)Ljava/lang/Object;" the class loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) of the current class, package/class, and the class loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) for resolved class, package/class, have different Class objects for the type package/class used in the signature

这个主要是bundle之间的存在相同的类,导致在各自的ClassLoader找不到导致的. 或者有冲突, 比如在bundleA依赖bundleB, 而且二者同时存在classC, classD, 而且存在classD d = classC.method(), 那么在引用的时候如果存在这样的使用方式: bundleA的classD d = bundleB的classC.method() 那么就会存在上面的问题, 解决办法就是相同的class只存在一份, 然后依赖的时候通过import package的方式来加以引用即可.
0
0
分享到:
评论
1 楼 xiaoingzizizizi 2014-12-03  
lz我在使用OSGi下引入了一个axis2的webservice的bundle,但是出现了如下错误,能否帮忙解答一下,跪谢!Exception in thread "Thread-20" java.lang.LinkageError: loader constraint violat
ion: when resolving method "org.apache.axis2.description.AxisOperation.setName(L
javax/xml/namespace/QName;)V" the class loader (instance of org/eclipse/osgi/int
ernal/baseadaptor/DefaultClassLoader) of the current class, org/DmanagerStub, and the class loader (instance of org/eclipse/osgi/intern
al/baseadaptor/DefaultClassLoader) for resolved class, org/apache/axis2/descript
ion/AxisOperation, have different Class objects for the type mespace/QName;)V us
ed in the signature

相关推荐

    osgi 资料 总结 实践

    总结,OSGi是一种强大的模块化系统,能够帮助开发者构建更加灵活、可扩展和易于维护的Java应用程序。通过理解其基本概念和实践,开发者可以利用OSGi的优势来优化项目结构,提高开发效率。在与Spring和Hibernate等...

    学习SpringDM+OSGI的总结

    1. **建立第一个Plug-in项目**:使用Eclipse自带的OSGI框架建立第一个插件项目。该插件项目会在控制台输出“HelloWorld”以表示启动成功,关闭时输出“GoodbyeWorld”。 2. **Activator类的作用**:Activator类用于...

    osgi学习笔记(一)

    总结来说,OSGi提供了一个强大的模块化系统,通过服务导向的架构,使Java应用更加灵活和可维护。开发者通过掌握OSGi,能够构建更高效、可扩展的系统,同时也能更好地应对复杂的应用场景和持续变化的需求。如果你计划...

    osgi总结文档收藏

    OSGi(Open Services Gateway Initiative)是一种Java模块化...总结,OSGi是一个强大的模块化系统,对于构建可维护、可扩展的Java应用程序具有显著优势。理解和掌握OSGi,可以帮助开发者构建更加健壮、灵活的软件系统。

    osgi资料

    - 最佳实践:分享开发者在OSGi开发过程中总结的经验和技巧,帮助避免常见陷阱。 3. **OSGI实战.pdf**: 这本书可能专注于通过实际项目展示OSGi的应用: - 开发工具:介绍支持OSGi的IDE(如Eclipse)和构建工具...

    OSGI进阶.pdf

    7. **OSGi最佳实践**:最后,文档总结了一系列OSGi的最佳实践,包括将接口和实现分离为不同的 bundles、保持系统的动态性、搭建公司级的 bundle repository、创建共享 library bundle、最小化依赖以及避免启动顺序...

    osgi数据库连接demo

    总结来说,这个“osgi数据库连接demo”展示了如何在OSGi环境中配置C3P0连接池,使用iBATIS进行数据访问,并利用Spring-DS管理这些组件。整个过程涉及到OSGi的包管理、连接池的配置、数据访问层的集成以及日志记录。...

    Osgi的简单实现

    **Osgi的简单实现** ...总结,Osgi提供了一种强大且灵活的方式,使得在Eclipse这样的环境中构建模块化、可扩展的应用成为可能。通过理解并实践Osgi,开发者可以创建更加健壮和易于维护的Java应用程序。

    OSGi与Web容器的整合

    总结来说,OSGi与Web容器的整合提供了一种强大的方式来构建和部署Web应用,使得应用组件可以独立升级和替换,减少了应用的耦合度。通过选择合适的工具和方法,开发者可以充分利用OSGi的动态性和灵活性,创建更健壮、...

    基于Eclipse开发OSGI的简单实例

    OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它允许在单个JVM上动态地部署、管理、发现和使用服务。Eclipse是一个广泛使用的开源集成开发环境(IDE),它支持OSGi框架,使开发者能够在Eclipse...

    OSGI相关

    总结,OSGI是一种强大的模块化框架,它提供了灵活的依赖管理、服务注册和动态更新等功能,适用于大型项目、插件系统和库的开发。理解并掌握OSGI能帮助开发者构建更稳定、可扩展的Java应用程序。

    OSGI的servlet配置和简单实例

    在OSGI环境中,Servlet的配置和使用与传统的Java Web应用有所不同。下面我们将深入探讨OSGI中的servlet配置以及一个简单的实例。 1. OSGI中的Servlet注册 在OSGI环境中,我们不再通过web.xml文件来注册Servlet,...

    osgi文档

    总结来说,OSGi是一种强大的模块化系统,它提供了动态部署、服务导向的架构和类隔离等特性,有助于构建更健壮、可维护的Java应用。通过阅读提供的PDF文档和实践代码,开发者可以深入理解OSGi的工作原理,并将其有效...

    OSGi in Practice 完整版

    - **版本管理和并行版本**:OSGi支持精确的版本控制,允许同一系统的不同bundle使用不同版本的库。 **1.5 动态模块** OSGi框架的一个关键特性是支持动态加载和卸载模块,这意味着可以在运行时安装、更新或移除模块...

    org.eclipse.osgi_3.7.0.v20110613及源码

    总结,org.eclipse.osgi作为OSGi的实现,是理解模块化开发和动态服务的关键。通过深入研究其3.7.0.v20110613版本及源码,开发者不仅能掌握OSGi的基本概念,还能在实践中提升软件设计和架构的能力。

    OSGI企业技术规范

    根据所提供的部分内容,OSGi Enterprise Release 5 的使用需遵循OSGi Specification License Version 2.00的条款。此许可证授权用户查看、下载及复制该规范文档,但禁止创建任何衍生作品。对于实现该规范的软件产品...

    OSGi with CAR-Bundle

    总结起来,OSGi是一种强大的动态模块系统,它通过Bundle实现了Java应用的模块化和动态化。与CAR的结合可以进一步优化性能,提高组件化程度,并允许使用不同的编程语言和技术栈。这种组合使得开发者能够构建更加灵活...

    osgi&spring规范

    总结来说,"OSGi&Spring 规范"涵盖了Java开发中的模块化和企业级应用两个重要方面,涉及到动态加载、服务注册、依赖注入等多个核心概念,是Java开发者深入理解和实践现代Java应用开发的重要知识领域。

    osgi简介PPt(自制)

    总结来说,OSGI是一个基于Java的中间件平台,提供了模块化、生命周期管理和动态服务注册等功能,确保了在多种设备和环境下应用程序的可移植性和稳定性。通过其丰富的API和灵活的架构,开发者可以创建更可靠、可扩展...

Global site tag (gtag.js) - Google Analytics