最近使用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的方式来加以引用即可.
分享到:
相关推荐
总结,OSGi是一种强大的模块化系统,能够帮助开发者构建更加灵活、可扩展和易于维护的Java应用程序。通过理解其基本概念和实践,开发者可以利用OSGi的优势来优化项目结构,提高开发效率。在与Spring和Hibernate等...
1. **建立第一个Plug-in项目**:使用Eclipse自带的OSGI框架建立第一个插件项目。该插件项目会在控制台输出“HelloWorld”以表示启动成功,关闭时输出“GoodbyeWorld”。 2. **Activator类的作用**:Activator类用于...
总结来说,OSGi提供了一个强大的模块化系统,通过服务导向的架构,使Java应用更加灵活和可维护。开发者通过掌握OSGi,能够构建更高效、可扩展的系统,同时也能更好地应对复杂的应用场景和持续变化的需求。如果你计划...
OSGi(Open Services Gateway Initiative)是一种Java模块化...总结,OSGi是一个强大的模块化系统,对于构建可维护、可扩展的Java应用程序具有显著优势。理解和掌握OSGi,可以帮助开发者构建更加健壮、灵活的软件系统。
- 最佳实践:分享开发者在OSGi开发过程中总结的经验和技巧,帮助避免常见陷阱。 3. **OSGI实战.pdf**: 这本书可能专注于通过实际项目展示OSGi的应用: - 开发工具:介绍支持OSGi的IDE(如Eclipse)和构建工具...
7. **OSGi最佳实践**:最后,文档总结了一系列OSGi的最佳实践,包括将接口和实现分离为不同的 bundles、保持系统的动态性、搭建公司级的 bundle repository、创建共享 library bundle、最小化依赖以及避免启动顺序...
总结来说,这个“osgi数据库连接demo”展示了如何在OSGi环境中配置C3P0连接池,使用iBATIS进行数据访问,并利用Spring-DS管理这些组件。整个过程涉及到OSGi的包管理、连接池的配置、数据访问层的集成以及日志记录。...
**Osgi的简单实现** ...总结,Osgi提供了一种强大且灵活的方式,使得在Eclipse这样的环境中构建模块化、可扩展的应用成为可能。通过理解并实践Osgi,开发者可以创建更加健壮和易于维护的Java应用程序。
总结来说,OSGi与Web容器的整合提供了一种强大的方式来构建和部署Web应用,使得应用组件可以独立升级和替换,减少了应用的耦合度。通过选择合适的工具和方法,开发者可以充分利用OSGi的动态性和灵活性,创建更健壮、...
OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它允许在单个JVM上动态地部署、管理、发现和使用服务。Eclipse是一个广泛使用的开源集成开发环境(IDE),它支持OSGi框架,使开发者能够在Eclipse...
总结,OSGI是一种强大的模块化框架,它提供了灵活的依赖管理、服务注册和动态更新等功能,适用于大型项目、插件系统和库的开发。理解并掌握OSGI能帮助开发者构建更稳定、可扩展的Java应用程序。
在OSGI环境中,Servlet的配置和使用与传统的Java Web应用有所不同。下面我们将深入探讨OSGI中的servlet配置以及一个简单的实例。 1. OSGI中的Servlet注册 在OSGI环境中,我们不再通过web.xml文件来注册Servlet,...
总结来说,OSGi是一种强大的模块化系统,它提供了动态部署、服务导向的架构和类隔离等特性,有助于构建更健壮、可维护的Java应用。通过阅读提供的PDF文档和实践代码,开发者可以深入理解OSGi的工作原理,并将其有效...
- **版本管理和并行版本**:OSGi支持精确的版本控制,允许同一系统的不同bundle使用不同版本的库。 **1.5 动态模块** OSGi框架的一个关键特性是支持动态加载和卸载模块,这意味着可以在运行时安装、更新或移除模块...
总结,org.eclipse.osgi作为OSGi的实现,是理解模块化开发和动态服务的关键。通过深入研究其3.7.0.v20110613版本及源码,开发者不仅能掌握OSGi的基本概念,还能在实践中提升软件设计和架构的能力。
根据所提供的部分内容,OSGi Enterprise Release 5 的使用需遵循OSGi Specification License Version 2.00的条款。此许可证授权用户查看、下载及复制该规范文档,但禁止创建任何衍生作品。对于实现该规范的软件产品...
总结起来,OSGi是一种强大的动态模块系统,它通过Bundle实现了Java应用的模块化和动态化。与CAR的结合可以进一步优化性能,提高组件化程度,并允许使用不同的编程语言和技术栈。这种组合使得开发者能够构建更加灵活...
总结来说,"OSGi&Spring 规范"涵盖了Java开发中的模块化和企业级应用两个重要方面,涉及到动态加载、服务注册、依赖注入等多个核心概念,是Java开发者深入理解和实践现代Java应用开发的重要知识领域。
总结来说,OSGI是一个基于Java的中间件平台,提供了模块化、生命周期管理和动态服务注册等功能,确保了在多种设备和环境下应用程序的可移植性和稳定性。通过其丰富的API和灵活的架构,开发者可以创建更可靠、可扩展...