`
snoopy7713
  • 浏览: 1123340 次
  • 性别: 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>

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

相关推荐

Global site tag (gtag.js) - Google Analytics