前言:我相信做基于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.plugins<!---->groupId>
- <artifactId>maven-osgi-plugin<!---->artifactId>
- <extensions>true<!---->extensions>
- <version>0.3.0<!---->version>
- <configuration>
- <manifestFile>resources/manifest.mf<!---->manifestFile>
- <!---->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.plugins<!---->groupId>
- <artifactId>maven-osgi-plugin<!---->artifactId>
- <extensions>true<!---->extensions>
- <version>0.3.0<!---->version>
- <configuration>
- <osgiManifest>
- <bundleName>My OSGi Application<!---->bundleName>
- <bundleDescription>An example bundle application<!---->bundleDescription>
- <bundleActivator>org.safehaus.bundle.Activator<!---->bundleActivator>
- <importPackage>org.osgi.service.log<!---->importPackage>
- <bundleVendor>Safehaus<!---->bundleVendor>
- <!---->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>
这里提供一个实际运用的简要配置模板实例,大家可以稍作修改就可以直接使用了:
xml 代码
- <plugin>
- <groupId>org.apache.felix<!---->groupId>
- <artifactId>maven-bundle-plugin<!---->artifactId>
- <extensions>true<!---->extensions>
- <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-Package>
-
- <_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文件
xml 代码
- xml version='1.0' encoding='UTF-8' ?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
- <parent>
- <relativePath>../poms/compiled/<!---->relativePath>
- <groupId>org.ops4j.example.test.build<!---->groupId>
- <artifactId>compile-bundle<!---->artifactId>
- <version>0.1.0-SNAPSHOT<!---->version>
- <!---->parent>
-
- <properties>
- <bundle.package>com.zhoufu.demo<!---->bundle.package>
- <!---->properties>
-
- <modelVersion>4.0.0<!---->modelVersion>
- <groupId>org.ops4j.example.test.bundles<!---->groupId>
- <artifactId>create_bundle_demo<!---->artifactId>
- <version>1.0<!---->version>
-
- <name>${project.artifactId} [${bundle.package}]<!---->name>
-
- <packaging>bundle<!---->packaging>
-
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-dependency-plugin<!---->artifactId>
- <!---->plugin>
- <plugin>
- <groupId>org.ops4j.pax.maven<!---->groupId>
- <artifactId>maven-bundle-plugin<!---->artifactId>
- <!---->plugin>
- <plugin>
- <groupId>org.ops4j.pax.construct<!---->groupId>
- <artifactId>maven-pax-plugin<!---->artifactId>
- <!---->plugin>
- <!---->plugins>
- <!---->build>
-
- <!---->project>
非常好,当然,这只是个初始的POM,随着bundle的开发,这里面肯定有一些关于bundle的依赖配置,需要增加到MANIFAST.MF文件中去,那么怎么告诉pax打包的时候生成什么样的MANIFAST.MF文件呢,其实也就是在org.ops4j.pax.maven这个plugin的配置段里进行配置好了。如下,我从项目中,提取了一段配置的模板,大家可以参考参考
xml 代码
- <plugin>
- <groupId>org.ops4j.pax.maven<!---->groupId>
- <artifactId>maven-bundle-plugin<!---->artifactId>
- <extensions>true<!---->extensions>
- <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>
看见没,在我们原来的环境中多了一个新建的这个
分享到:
- 2007-10-14 18:56
- 浏览 14025
- 评论(5)
- 论坛回复 / 浏览 (4 / 16912)
- 查看更多
相关推荐
在IT行业中,OSGi(Open Services Gateway Initiative)是一种模块化软件开发的标准,它允许开发者将应用程序分解为可独立更新和管理的小型组件,称为服务或bundle。这些组件可以在运行时动态地安装、卸载和升级,极...
【清华大学】DeepSeek从入门到精通(视频课程+PDF)
自2019年以来,教育部启动实施“双高计划”,遴选确定首批“双高计划”建设单位197所,其中高水平学校建设单位56所,高水平专业群建设单位141所,河南省有黄河水利职业技术学院、河南工业职业技术学院等6所职业学校入选。2022年,教育部开展国家“双高计划”中期绩效评价,从评价结果看,国家“双高计划”任务进展顺利,建设成效突出,形成了一批先进经验做法和典型案例,在引领职业教育改革、服务国家战略和支撑区域发展方面形成示范势头。 今天,我们给大家分享一些“双高计划”专业群完整申报书与建设方案和中期评估报告。 ## 一、专业群完整申报书与建设方案 ## 二、“双高计划”中期报告 (100多份)
内容概要:本文详细探讨了电商平台上秒杀系统中减库存的设计逻辑和技术优化方法。首先,文中阐述了‘下单减库存’、‘付款减库存’和‘预扣库存’三种常见方式及其各自面临的问题和局限性,尤其是面对高并发流量冲击下的系统稳定性与数据准确性保障挑战。接着讨论了适用于大规模促销活动中快速而精准地扣除存货的方法,提出了诸如应用本地缓存(Local Cache)、引入高性能持久化键值存储(如Redis),甚至修改数据库引擎源代码(InnoDB 层面排队机制)等一系列先进解决方案来确保交易流程顺畅。此外,还提到了在极端情况发生(例如超卖)时如何借助补救措施挽回损失的具体实例。 适合人群:电商平台开发运维技术人员;有兴趣深入了解电商业务架构和技术优化的开发者和IT管理人员。 使用场景及目标:①帮助设计师理解不同减库存策略的应用时机及其利弊;②指导程序员针对特定业务需求选择最适合的技术路径进行项目构建;③提供给运维专家关于改善在线交易平台响应速度和服务质量的专业见解。 其他说明:本篇文章对于构建高效的电子商贸系统有着极高的参考价值,尤其是那些准备应对瞬息万变市场环境下的企业来说尤为重要。它不仅限于理论探讨层面,
动态表单,VUE动态表单。基于vue+elementplus实现动态表单组件,通过拖拽组件到面板即可实现一个表单。支持各个组件的动态隐藏显示,动态表格弹窗式维护。
【毕业设计】java-springboot-vue家居日用小百货交易网站实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot+vue火锅店管理系统源码(完整前后端+mysql+说明文档+LunW).zip
随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微服务在线教育系统的开发全过程。通过分析微服务在线教育系统管理的不足,创建了一个计算机管理微服务在线教育系统的方案。文章介绍了微服务在线教育系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本微服务在线教育系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,课程信息管理,课程类型管理,学科管理,购买的课程管理,职业规划管理,视频点播管理,我的笔记管理,我的课程管理,消息通知管理,学习交流,试卷管理,留言板管理,试题管理,系统管理,考试管理。用户功能有个人中心,用户管理,购买的课程管理,我的笔记管理,我的课程管理,消息通知管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得微服务在线教育系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高微服务在线教育系统管理效率。 关键词:微服务在线教育系统;SSM框架;MYSQL数据库;Spring Boot
javascript 基于Javascript实现,强化学习QLearning的一个贪吃蛇实例.
python教程学习
我国科学技术的不断发展,计算机的应用日渐成熟,其强大的功能给人们留下深刻的印象,它已经应用到了人类社会的各个层次的领域,发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分,使用计算机进行管理,具有非常明显的优点,利用网络的优势特开发了本基于Spring Boot的IT技术交流和分享平台。 本IT技术交流和分享平台是基于Spring Boot框架,采用Java技术,MYSQL数据库进行开发的。系统具有灵活的一体化设计方式,圆满完成了整个系统的界面设计。本系统实现了用户功能模块和管理员功能模块两大部分,通过该系统用户可以快速进行IT技术交流和分享,管理员可登录系统后台对系统进行全面管理,确保系统正常稳定的运行。系统功能齐全,符合用户IT技术交流和分享的需求。 本文主要首先介绍了课题背景、设计原则和研究内容,系统采用的相关技术及开发平台,接着对本基于Spring Boot的IT技术交流和分享平台进行系统需求分析和设计,包括系统的功能模块,数据库的设计,系统结构以及系统界面设计等,最后对进行系统测试,完成本篇论文。 关键词:IT技术交流, Spring Boot框架, Java技术,MYSQL数据库
疲劳检测yawn图片数据集
JDK7通过java-jwt验证
【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
python学习资源
51CTO 1、技术解析篇-DeepSeek入门宝典 2、开发实战篇-DeepSeek入门宝典 3、行业应用篇-DeepSeek入门宝典 4、个人使用篇-DeepSeek入门宝典
内容概要:本文档是由高正奇编辑的针对模式识别和机器学习(PRML)教科书的一份详细的解答手册。文档覆盖了从基本概念如误差函数求导、贝叶斯定理应用到多元高斯分布计算、Gamma函数积分及其性质等一系列复杂问题的解决方案,以及涉及线性模型分类的基础练习题、条件概率和联合概率计算等入门级习题。每一题都经过细致推导,帮助学生加深对机器学习相关概念的理解并掌握具体的数学方法。 适合人群:主要适用于正在攻读机器学习、模式识别相关课程的学生,以及从事数据科学工作的专业人士作为深入理解和实践指南。 使用场景及目标:本手册旨在辅助教学过程中遇到的具体难题解析,在研究和实践中作为参考资料进行理论验证和技术难点突破,尤其有助于准备考试或者项目实施时需要巩固知识的应用场合。 其他说明:书中题目涵盖广泛,既有直观的概率论应用,也有复杂的积分变换技巧和最优化思路展示,对于希望提高自身计算能力和解决实际问题能力的学习者非常有价值。但要注意的是,部分内容较为深奥,可能不适合初学者自学使用,最好配合课堂讲解或其他教材一起学习效果更佳。
python学习资源
RFID-MATLAB的高等数学-CH06.rar
spaceX 动力学分析