`
snoopy7713
  • 浏览: 1149083 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

几种OSGI bundle的打包方法及注意事项

    博客分类:
  • OSGi
 
阅读更多

前言:我相信做基于OSGI框架开发的朋友,对于OSGI的基本单元Bundle应该并不陌生,平时的开发中,做得最多事情就是bundle的开发和打包 了,打包其实属于蛮重要的一个过程,为什么说他重要呢,其实打包的过程就是一个理清bundle依赖关系的过程,在对OSGI的学习和使用过程中,个人觉 得最令人头痛的就是bundle之间的依赖关系,而且我到现在为止还没有找到一种比较好的工具能够很好的管理OSGI环境中的各个bundle的依赖关 系。不过现在公司也有开始考虑做一些类似phpadmin,mysqladmin这样的基于web的管理工具来对bundle进行统一管理,在这之前,如 何解决依赖关系,如何将bundle正确的打包出来并进行部署成了OSGI开发中的一个主要问题,而这篇文章中,我主要介绍目前我自己用过得几种打包方 式,总结下经验,如果大家有更好的方法或者有不清楚的地方也可以提出来一起讨论~

第一种方法就是直接通过 eclipse 提供的 export 功能,来直接导出一个一个插件工程,这个过程,相信大家已经用的很熟悉了,直接 eclipse 给你的提示一步步来就可以了。


这里我只想稍微提几个注意的问题,首先是在打包的时候注意把必要的资源文件给勾选上,像我有时就忘记勾选上一些 OSGI service 的配置文件,而导致 service 不能发布或者获取。其次,检查好你的项目自描述文件 MANIFAST.MF 里面的 OSGI 相关的配置信息是否都已经写正确,该 export 和该 import 的包是否写对,个人觉得 OSGI 最让人头疼的就是解决 bundle 之间的依赖关系,有时候 OSGI 环境一大,依赖关系变得复杂,导出包,引用包常常会容易混淆,所以对 OSGI 环境中的组件的依赖进行统一管理和限定,可以使 bundle 的依赖更加清晰,环境也易于管理,降低 OSGI 开发复杂度。最后,有时候在导出包的时候会碰到一些问题,比如 bundle 之间循环调用,多半还是由于 Bundle 之间的依赖发生了冲突的关系,检查一下是否多个 bundle 是否导出了相同包, bundle 的引入包是否正确等等。

 

第二种方法则是利用 apache maven2.0 提供的一个专门来打 OSGI 包的 felix http://felix.apache.org/site/maven-osgi-plugin.html )插件来利用 maven 进行 OSGI bundle 的打包工作, felix 这个插件在 maven 中的使用还是比较容易的。官方网站( http://cwiki.apache.org/FELIX/osgi-plugin-for-maven-2.html )上给出了一个比较详尽的使用说明,这里我大致说明一下,只需要在项目的 pom 文件中配置一个 plugin ok 了,最简单的配置如下: <o:p></o:p>

xml 代码
    <plugins>  
      <plugin>  
        <groupId>org.apache.felix.pluginsgroupId>  
        <artifactId>maven-osgi-pluginartifactId>  
        <extensions>trueextensions>  
        <version>0.3.0version>  
        <configuration>  
          <manifestFile>resources/manifest.mfmanifestFile>  
        <configuration>  
      <plugin>  
    <plugins>  
 

当然 这种配置就是告诉 maven 在对你的项目进行打包的时候直接使用 resources/manifest.mf 文件进行打包了,除此之外,如果你并不想一开始就指定一个 MANIFAST.MF 文件,而是将这个工作在打包过程交给 felix 去完成的话,那么你可以为 MANIFAST.MF 文件配置一些必要的属性,然后 felix 会根据这个属性来生成一个 MANIFAST.MF 一起打包到项目中,如: <o:p></o:p>

xml 代码
    <plugins>  
      <plugin>  
        <groupId>org.apache.felix.pluginsgroupId>  
        <artifactId>maven-osgi-pluginartifactId>  
        <extensions>trueextensions>  
        <version>0.3.0version>  
        <configuration>  
          <osgiManifest>  
            <bundleName>My OSGi ApplicationbundleName>  
            <bundleDescription>An example bundle applicationbundleDescription>  
            <bundleActivator>org.safehaus.bundle.ActivatorbundleActivator>  
            <importPackage>org.osgi.service.logimportPackage>  
            <bundleVendor>SafehausbundleVendor>  
          <osgiManifest>  
        <configuration>  
      <plugin>  
    <plugins>  
 

显然 <osgimanifest></osgimanifest> 标签开始,你就是在手动的写一个 MANIFAST.MF 文件的相关 OSGI 配置信息了,此外你还可以加上一些打包配置来将指定的资源文件进行打包,如:

<osgimanifest></osgimanifest> 标签以内加入如下的设定

<_include>

       -target/classes/META-INF/details.bnd

 

<_classpath>target/classes

第一种是告诉 maven 将一个指定文件打包

第二种是设定编译后类文件的存放位置

<o:p> </o:p>

这里提供一个实际运用的简要配置模板实例,大家可以稍作修改就可以直接使用了:

    <plugin>  
        <groupId>org.apache.felixgroupId>  
        <artifactId>maven-bundle-pluginartifactId>  
            <extensions>trueextensions>  
                <configuration>  
                    <instructions>  
                        <Bundle-Version>  
                            ${project.version}  
                        Bundle-Version>  
                        <Bundle-SymbolicName>  
                           $(replace;${project.artifactId};-;_);singleton:=true  
                        Bundle-SymbolicName>  
          
                        <_classpath>target/classes_classpath>  
                        <Export-Package>  
                           com.yourcompany.artifactId.*;version="${project.version}"  
                        <Export-Package>  
                        <Import-Package>  
                            org.springframework.test;resolution:=optional,*  
                        <Import-Package>  
                        <DynamicImport-Package>*DynamicImport-ackage>  
                              
                        <_include>  
                            -target/classes/META-INF/details.bnd  
                        <_include>  
                        <Include-Resource>  
                             
                            <Include-Resource>  
                        <instructions>  
                    <configuration>  
                <plugin>  
 

以上仅是我在实际项目中打包时候的设置过得一个样例,仅供大家参考,大家可以根据实际项目信息来自行设置自己的项目描述。具体的其他 OSGI 相关配置所应对应设定什么样的标签的内容,请参考 apache 官网( http://cwiki.apache.org/FELIX/osgi-plugin-for-maven-2.html )提供的参考。

配置完毕后,在当前项目目录下,运行 maven package 命令,就能得到一个由你自己自配置的一个 OSGI bundle 了。

第三种方式:

利用 OPS4J 组织提供的一个叫 Pax 的 工具来进行OSGI bunder的构建. 这里需要说的就是,我什么要用PAX来构建一个OSGI工程呢,eclipse不是已经有很好的OSGI开发支持了么,这里要说的就是,PAX构建的 OSGI工程并不是单单某个OSGI bundle的开发,而是,PAX会主动的为你创建一个基本的OSGI环境,这个环境包括一些OSGI的基础包,你可以通过PAX的命令来启动这个 OSGI环境,同时PAX也会将其管理的一些Bundle进行打包实时发布到这个环境中,这样不但可以按需的打包bundle,还可以迅速的构建一个 OSGI环境来进行调试了。这里我简要的说一下PAX的使用方法,PAX是一个专门用来构建和管理OSGI 环境的一个工具,从官网的介绍我们可以看到,他主要提供pax-create-project pax-add-repository pax-create-bundle pax-import-bundle pax-embed-jar pax-wrap-jar pax-move-bundle pax-remove-bundle  等几大脚本命令来,完成一些儿OSGI环境的构建工作。这里我只简要介绍一下我平时几条最常用的命令,通过这些命令的介绍来大概的给大家讲解一下pax的 使用方式。
首先从官方down到pax的最新包

Down 好后,进行解压,解压完毕后,为了在命令行中使用,你需要将其中的 bin 目录设置到环境变量 PATH 中,设置完毕后你就可以到你希望创建项目的目录,利用 PAX 提供的第一条命令 pax-create-project 来创建一个 OSGI 工程。创建好这个工程后,我们就可以利用 maven 的命令来启动这个 OSGI 的环境工程, pax 会为帮我们构建一个基础 OSGI 环境,以及将 test 工程中的 bundle 工程打成 bundle 部署到这个环境中去,当然我们现在还为在这个工程中创建任何 bundle 工程,所以,我们启动的只是一个最小的 OSGI 环境。

<o:p> </o:p>

接下来我们在这个 PAX 的工程中来创建我们 bundle 工程, pax 提供四种命令来创建 bundle 的打包工程 pax-create-bundle pax-import-bundle pax-embed-jar pax-wrap-jar

pax-create-bundle 是完全用 pax 创建一个符合 OSGI 规范 bundle 项目,最后在执行 mvn clean install pax:provision 命令时, pax 会把这个工程打成一个 bundle 然后部署到它的 OSGI 环境中去。

pax-import-bundle 则是直接导入一个符合 OSGI 规范的 bundle ,这样在启动 OSGI 环境的时候 pax 会去指定 group(-g) ,指定的 artifactId(-a) 和指定的 version(-v) repository 下去搜索指定的 OSGI bundle 并将其导入到环境中。

pax-wrap-jar 通过该命令则可以利用 pax 将一个 jar 包打包成一个符合 OSGI 规范的 bundle pax 能够对这个 jar 包进行分析,找出其中的依赖关系,并生成相关的 MANIFAST.MF 文件。再吧这个 bundle 部署到之前的 OSGI 环境中去。

在项目中我最常用的就是以上三条,其余的命令,以及这些命令的具体使用方法大家可以参考官方网站给出的示例。

接下来,我就利用 pax-create-bundle 命令来创建一个 bundle 工程,来给大家演示一下。

先选择到一个需要创建工程的目录下


 

看看一个test工程生成了,可以看到pax实际上给我们生成了一些初始的pom,大家可以打开看看


 

接下来我们马上来跑下这个工程。看看pax会给我们带来什么效果


先进入到text目录,大家可以打开pax生成的pom.xml看看,实际上pax是把自己作为了一个maven的插件来供maven调用,这里我们用maven来运行这个工程,命令是mvn clean install pax:provision
<o:p> </o:p>


 

可以看到pax为我们启动了一个OSGI运行环境,我们用ss命令来查看但前环境中的bundle信息


 

呵呵,果然是一个最小的OSGI环境。

接下来我输入命令来创建一个 bundle 工程:

 

pax-create-bundle -g com.zhoufu.demo -a create_bundle_demo -v 1.0, 接下来看看 pax 会为我们产生什么



可以看到在
test 环境工程下, pax 为我们创建了一个符合 OSGI 规范的 create_bundle_demo 工程


<o:p> </o:p>

接下来我们就可以直接对这个工程进行 maven mvn eclipse:eclipse )使其成为一个 eclipse 可以识别的工程,来用 eclipse 对其进行开发了。

当开发完毕后,我们就可以直接利用之前的 pax:provision 命令来启动这个环境的工程, pax 会依次由 test 目录下的 pom 来检索相应的 bundle 工程,按照各个 bundle pom 的配置对其进行 OSGI bundle 打包工作,打成 bundle 后再将其部署到启动的 OSGI 环境中去。

 

现在,我们看看我们刚才生成的那个工程里的 POM 文件

    <plugin>    
                        <groupId>org.ops4j.pax.mavengroupId>    
                        <artifactId>maven-bundle-pluginartifactId>    
                        <extensions>trueextensions>    
                        <configuration>    
                            <instructions>    
                                <Bundle-Version>    
                                    这里是bundle的Version    
                                Bundle-Version>    
                                <Bundle-SymbolicName>    
                                    这里是Bundle-SymbolicName的配置    
                                Bundle-SymbolicName>    
                                    
                                <_classpath>    
                                 …    
                                _classpath>    
                                <Export-Package>    
                                …    
                                Export-Package>    
                                <Import-Package>    
                                …    
                                Import-Package>    
                                <Bundle-ClassPath>    
                                    …    
                                Bundle-ClassPath>    
                                <Bundle-Activator>    
                                    …    
                                Bundle-Activator>    
                                <DynamicImport-Package>*DynamicImport-Package>    
                                    
                                <_include>    
                                    -target/classes/META-INF/details.bnd    
                                _include>    
                            instructions>    
                        configuration>    
                    plugin>   
 

看见了吧,其实这个跟之前的利用 maven 插件来打包的方式很相似,也是把配置写到 pom 之中,再由插件去进行打包,只不过这里用的插件是 pax

<o:p> </o:p>

假设我们的 bundle 开发好了,我们再把之前的那个 test 工程跑一下看看

 

test 目录下敲 mvn clean install pax:provision 命令。看看结果 <o:p></o:p>

<u1:p>  </u1:p><o:p></o:p>

看见没,在我们原来的环境中多了一个新建的这个
分享到:
评论

相关推荐

    OSGI bundle

    OSGI bundle提供了一种模块化的软件开发方式,使得Java应用程序可以按需加载和卸载组件。`online-1.0.0.jar`和`jxemail-1.0.0.jar`是两个示例bundle,分别实现了在线用户管理和邮件发送的功能。通过Apache Felix这样...

    基于EQUINOX的 OSGI BUNDLE 运行例子

    在IT领域,OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许开发者将应用程序分解为独立的组件,称为Bundles。这些Bundles可以动态地安装、卸载和更新,而不影响系统的其他部分。...

    基于Eclipse的Equinox框架开发OSGi Bundle应用

    在Java世界中,OSGi(Open Services Gateway Initiative)是一种模块化系统,它允许开发者创建可独立更新和依赖管理的模块,即Bundle。Eclipse的Equinox是实现OSGi规范的一个流行实现。这篇博文将深入探讨如何使用...

    OSGI bundle change listener

    这个接口定义了一个方法`bundleChanged(BundleEvent event)`,每当bundle的状态发生变化时,OSGi框架就会调用这个方法,传递一个`BundleEvent`对象,其中包含了关于事件的详细信息,如变化的bundle和新旧状态。...

    osgi资料打包

    OSGi(Open Services Gateway Initiative)是一种Java模块化系统和服务平台,它允许开发人员将应用程序分解为可独立更新和管理的模块。这个平台的核心是它的模块系统,也称为OSGi框架,它提供了一种动态、模块化的...

    tomcat嵌入OSGI容器

    OSGI是一种Java平台上的服务导向架构,它允许动态地加载、卸载和更新软件组件,提高了灵活性和可维护性。 描述中提到“新版的tomcat融合OSGI容器程序,老版的不好使,自己改了下”,这暗示了在旧版本的Tomcat中,...

    eclipse maven 打包bundle

    在Eclipse中,使用Maven进行bundle打包通常涉及以下几个步骤: 1. **设置Maven项目**: 创建一个新的Maven项目或者将现有的Eclipse项目转换为Maven项目。在Eclipse中,可以通过右键点击项目 -&gt; Configure -&gt; Convert...

    OSGi with CAR-Bundle

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

    浅析OSGI的bundle依赖

    OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许在单个JVM上动态地发现、加载、卸载和管理软件模块,称为bundle。在OSGI环境中,每个bundle都是一个独立的代码单元,具有自己的类...

    OSGI应用中整合Spring、Mybatis、Spring MVC案例

    Mybatis的配置文件可以放在OSGI的bundle中,通过OSGI服务注册Mybatis的SqlSessionFactory,然后在其他bundle中通过服务查找来使用。 Spring MVC是Spring框架的一部分,用于构建Web应用程序。在OSGI环境中集成Spring...

    Jar转换为Bundle工具

    OSGI(Open Service Gateway Initiative)是一种模块化系统和Java服务框架,它允许在单个Java虚拟机(JVM)上运行多个独立的模块,每个模块称为一个bundle。在OSGI环境中,JAR文件需要进行特殊处理,以便它们能够...

    osgi helloworld

    你还需要将`client`和`server` bundle打包成jar文件,并使用框架提供的命令行工具或图形界面进行部署。 为了深入了解这个示例,你需要学习以下关键概念: 1. Bundle生命周期:启动、暂停、停止和卸载。 2. Manifest...

    osgi发布http服务的各种bundle,各种jar包,全全全~

    osgi发布http服务的各种bundle,各种jar包,全全全~非常好用的技术包 包括:org.eclipse.equinox.http_1.0.0.v20060601a.jar org.eclipse.equinox.ds_1.0.0.v20060601a.jar org.eclipse.equinox.servlet.api_1.0.0...

    OSGI实战和OSGI进阶打包提供

    OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它为构建可伸缩、动态、模块化的应用程序提供了框架。在Java开发中,OSGI技术能够帮助开发者解决类加载器问题,实现组件化开发,便于软件的维护和...

    OSGi与Web容器的整合

    Web Application Bundle (WAB) 是一种特殊的OSGi Bundle,它可以作为一个Web应用运行。WAB包含传统的Web项目元素,如Web-INF目录和web.xml,同时还包含OSGi元数据,如MANIFEST.MF文件,使得它们能够作为OSGi模块运行...

    构建基于Maven的OSGI

    在本篇文章中,我们将详细介绍如何使用Maven构建一个OSGi项目,包括项目的创建、容器的启动、Bundle的导入与创建等方面。 #### 开发环境 - Eclipse 3.6 或更高版本 - Maven - OSGi框架(例如Equinox或Felix) - ...

    OSGI.rar_OSGI eclipse_eclipse osgi_java OSGI_osgi

    8. **打包与打包工具**:如BNDTools,用于创建和管理OSGI Bundle的工具。 9. **例子**:压缩包中提到的“osgi编程的例子”,可能包含一个或多个示例项目,演示了如何从零开始创建和运行OSGI应用,以及如何在Eclipse...

    osgi相关文档、及学习资料

    可能会包括如何创建和打包OSGi Bundle、配置Manifest文件(包含Bundle的元数据)、使用Blueprint或Declarative Services进行服务声明、理解OSGi的生命周期管理以及如何在实际项目中应用OSGi技术。 **OSGi原理与最佳...

    基于Eclipse开发OSGI的简单实例

    3. **打包与部署**:将配置好的SpringDM项目打包成Bundle,并将其部署到OSGi运行时,如Equinox或Felix。 4. **启动与测试**:在OSGi框架中启动Bundle,SpringDM会自动初始化配置的服务并管理其生命周期。通过OSGi...

    使用Equinox开发OSGI应用程序工程及源码

    **使用Equinox开发OSGI应用程序工程及源码详解** OSGi(Open Service Gateway Initiative)是一种模块化系统和Java服务框架,它允许在运行时动态发现、安装、卸载和更新软件模块。Equinox是Eclipse基金会提供的一个...

Global site tag (gtag.js) - Google Analytics