`
killko
  • 浏览: 105047 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Group-logo
Servicemix&Fu...
浏览量:0
社区版块
存档分类
最新评论

osgi bundle的编译时与运行时的依赖

阅读更多
    bundle之间存在耦合,就必然存在依赖关系,由于osgi特殊的classloader组织结构,osgi的bundle之间及bundle内部的依赖关系稍微比传统java应用稍微复杂点。
   
    首先,在传统java应用中,在运行时,大部分jar包都是由同一个classloader来加载,所以它们在编译时和运行时时的依赖关系基本上是一致的,也就是说你编译通过了,在运行时,如果将编译时需要的jar包加载了,就一般不会存在在ClassNotFound之类的问题,所以通常做传统java应用开发的开发人员不需要或较少理会“编译时”和“运行时”两个阶段。
   
    而在osgi语境下,编译时依赖和运行时依赖通常存在较大差别。 假设我们以maven来管理bundle的工程项目。

    首先,bundle的编译是和manifest.mf无关的,无论manifest.mf里作了任何设置,都只会被原样打包到目标bundle里,编译器根本不会去解析manifest.mf。bundle编译时只与maven里的pom指定的依赖相关,如果bundle里的代码中引用了第三方包,那么pom里就需要显式指定或隐式地继承对这个第三方包的依赖。否则就无法编译通过。

    而在运行时,bundle的状态从installed,到resolved,再到active。在installed到resolved的迁移过程中,需要满足manifest.mf中的import-package的条件,也就是必须有其它bundle export出这些packages,否则无法resolved。所以,bundle的运行时的依赖首先就是由manifest.mf里的import-package指定了(Bundle-Required等项也限定了)。而这时,原来在maven的pom.xml里指定的依赖关系不会影响bundle的resolve过程。

   从上面分析可知,bundle的编译时和运行时的依赖关系是有区别的。 如果我们在maven的pom.xml中指定了多余的依赖关系,一般并不影响bundle的编译(除非有包的冲突)。但如果在manifest.mf的import-package里指定了多余的package,就可能会导致bundle无法resolved。
 
1
1
分享到:
评论
2 楼 killko 2013-02-25  
lg_asus 写道
bundle编译时,如果一个bundle用到了另一个bundle下的包,则那个bundle下的包要Export出来,这个bundle要Import进来, 你怎么说没有依赖?

如果是用到另一个bundle的包,你应该会在maven pom.xml里里加这个bundle的依赖关系,然后就可以编译了,而无论manifest.mf里有没有import-package都不会导致编译不了。
1 楼 lg_asus 2013-02-25  
bundle编译时,如果一个bundle用到了另一个bundle下的包,则那个bundle下的包要Export出来,这个bundle要Import进来, 你怎么说没有依赖?

相关推荐

    OSGi with CAR-Bundle

    对比于CAR(Component Archive),OSGi Bundle在运行时是基于Java虚拟机(JVM)的,而CAR则可以包含C/C++编译后的二进制代码,可能不依赖于特定的框架。尽管两者都是组件化的,但CAR更倾向于作为嵌入式平台的组件,...

    可运行的OSGI实例

    2. **OSGI Bundle**:学习创建和管理OSGI Bundle,包括编写Bundle的MANIFEST.MF文件,定义导出和导入的包依赖。 3. **服务注册与发现**:学习如何在OSGI框架内注册服务,并让其他模块发现和使用这些服务。 4. **...

    blueprint-osgi-bundle:OSGi 示例

    **描述分析:** "blueprint-osgi-bundle" 是这个项目的简短描述,暗示它是一个与Blueprint相关的OSGi捆绑包。捆绑包是OSGi的核心概念,它相当于Java的JAR文件,但包含元数据来描述其服务和依赖关系。 **标签解析:*...

    乱凑的一个osgi的demo

    4. 将打包好的bundle复制到OSGi运行时的`bundles`目录。 5. 启动OSGi运行时,并观察控制台输出,确认bundle是否成功加载和启动。 6. 如果项目提供了服务,可以通过OSGi服务注册表进行服务的查找和交互。 通过这个...

    osgi-bundle-hello-world:使用Maven的演示OSGI捆绑包

    而“将捆绑罐复制到OSGI容器,例如Felix或Faran”表明我们需要将生成的捆绑包部署到支持OSGi的容器中,如Apache Felix或Apache Karaf,它们是OSGi规范的实现,提供了一个运行时环境来管理和执行OSGi捆绑包。...

    maven+osgi

    3. Maven与OSGi的结合:在OSGi环境中,Maven可以帮助管理模块的依赖关系,将JAR文件打包为OSGi兼容的bundle。Maven的BND插件或Apache Felix Bundle Plugin就是用来将Maven项目转换为OSGi bundle的工具。通过这些插件...

    Felix_OSGi实作

    OSGi规范使得Java程序可以被设计成一套小型的、独立的模块(称为Bundle),这些模块可以在运行时动态地加载、卸载、启动或停止。 Felix是一个遵循OSGi规范的轻量级、模块化的Service Oriented Runtime,由Apache...

    ext.bundle.osgi.common-1.0.8.zip

    `ext.bundle.osgi.common`部分则专注于在Gradle环境中实现对OSGi规范的支持,使得Android开发者能够在构建过程中轻松处理OSGi相关的配置和依赖管理。 接着,我们来谈谈`gradle-android-plugin.zip`,这是一个专门为...

    OSGI进阶 dist ZIP

    5. **生命周期管理**:OSGI bundle有启动、暂停、停止和更新四种状态,允许开发者在运行时动态地管理bundle,这为热部署和热更新提供了可能。 6. **版本管理**:OSGI支持多版本共存,每个bundle可以声明其依赖的库...

    OSGI实战(PDF+源码+问题解决方法)

    5. **开发环境与工具**:介绍如何使用Eclipse等IDE进行OSGI开发,以及使用Equinox、Felix等OSGI运行时环境。 6. **部署与打包**:讲解如何将应用打包为OSGI bundle,以及如何在OSGI框架中部署和管理这些bundle。 ...

    osgi Equinox bridge and spring dm最新jar包

    Equinox作为OSGi的实现,提供了运行时环境和管理工具,帮助开发者管理这些bundles。 Spring DM(现在被称为Spring OSGi)是Spring框架的一部分,它为OSGi环境提供了依赖注入(DI)和面向切面编程(AOP)的能力。...

    OSGi 模块管理 动态管理部

    2. **动态加载**:根据用户的输入动态加载相应的Bundle,而不是静态编译时确定。 3. **服务注册与查找**:通过OSGi的服务层注册命令处理服务,并在运行时根据命令查找对应的服务。 通过这种方式,不仅提高了系统的...

    OSGI study

    OSGi允许开发人员将应用程序分解成独立的模块或组件(称为bundles),这些模块可以在运行时动态安装、卸载、启动、停止以及更新,而不会影响其他模块或系统的正常运行。 #### 二、OSGi环境搭建 在Windows 8环境下...

    osgi开发驱动

    OSGi是一种模块化系统,它允许开发者将应用程序分解为独立的、可重用的组件,这些组件可以在运行时动态地安装、卸载和更新,而不会影响到系统的其他部分。 描述中提到的"equinox SDK"是Eclipse Equinox,它是OSGi...

    基于Equinox开发OSGi应用(一)

    此外,OSGi的动态性使得我们可以在运行时更新bundle,无需停止整个应用程序。 **9. 源码与工具支持** 由于标签中提到了“源码”和“工具”,在实际开发过程中,我们可能需要使用Eclipse IDE,它内建了对OSGi和...

    学习SpringDM+OSGI的总结

    ### SpringDM与OSGI概述 #### OSGI概念解析 OSGI(Open Service Gateway Initiative),直译为“开放的服务网关初始化”,它是一系列针对Java动态化模块化系统的规范。OSGI不仅指代一个官方联盟,还代表着由该联盟...

    ant-1.6.5-osgi.jar.zip

    - 这些bundle可以在运行时安装、启动、停止、更新和卸载,无需重启应用。 - OSGi提供了一种动态的类加载机制,有助于解决Java的类加载问题,特别是在大型复杂系统中。 - OSGi规范定义了服务生命周期管理和依赖...

    java 模块化 开发

    静态模块化是指在编译时对模块的依赖关系进行检查和管理。Java 中的模块可以声明其依赖需求,这样,在运行时就可以在执行之前进行依赖检查。OSGi(Open Service Gateway Initiative)是 Java 的一个运行时动态模块...

    OSGI-R4 规范-中文

    - **动态绑定**: OSGi的服务模型支持服务的动态绑定和解绑,这意味着服务的消费者可以在运行时发现并绑定到服务提供者,而无需在编译时确定具体的实现。 #### 四、OSGi R4的API示例 以下是一些关于如何使用OSGi R4 ...

    动态编译、加载java类

    在Java编程中,动态编译和加载类是一种高级特性,它允许程序在运行时编译源代码并将其加载到Java虚拟机(JVM)中。这种能力对于开发灵活性高、可扩展性强的应用程序非常有用,比如在服务器端处理动态生成的代码、...

Global site tag (gtag.js) - Google Analytics