`

基于idea+maven的OSGI示例(二)

    博客分类:
  • OSGI
阅读更多

 

前言

 

前一篇文章中使用idea开发工具,并集成equinox框架展示了一个简单的OSGIbundle搭建的demo。文中提到使用idea插件可以实现对bundle元数据的自动生成(默认方式)。其实本质上idea自动的OSGI插件默认使用了bnd工具。

 

bundle jar与普通jar包的最直接的区别就是bundle jar包含一个元数据文件MANIFEST.MF。在开发OSGI模块过程中,最频繁的工作就是把自己开发的jar包封装成bundle,或者把一些第三方jar包封装成bundle,也就是如何去生成一个元数据文件MANIFEST.MF。最直接的方式就是,手工创建这个文件并放到jar包中。

 

但每次手工创建或修改元数据文件,然后再塞到jar包中是件很繁琐的事情。所以我们需要借助开发工具,目前不管是Eclipse还是Idea都有类似的生成元数据文件的插件,但这些插件本质上使用的是“bnd工具,我们先来了解下这个工具。

 

bnd工具

 

bnd工具是由OSGI技术主管Peter Kriens开发,bnd工具定义了一些元数据的配置项,这些配置项包含了OSGI模块层中配置项,并且还增加了一些自己独有的配置项(Include-ResourcePrivate-Package)。注意bnd中定义的配置项的本质作用是用于生成OSGI元数据配置文件中的配置项,也就是说OSGI框架最终识别的还是元数据配置文件。

 

bnd工具本质上是一个jar包,比如我电脑里的版本是bnd-0.0.384.jar,当然也可以在网上找到其他版本。通过这个工具,可以把一个普通的jar包(不管是自己开发的,还是第三方的)封装成一个被OSGI框架所识别的bundle

 

举个简单的例子,现在需要把一个第三方jar包:slf4j-api-1.6.5.jar(用于打印日志)制作成一个公共的bundle(其实官方提供的这个jar已经是一个带有元数据的bundle jar,为了测试可以先把这个文件删掉)。首先需要创建一个*.bnd的文件,这里创建的bnd文件为slf4j-api-1.6.5.bnd,内容为:

Export-Package: *
Import-Package: org.slf4j.impl;version=1.6.0

执行如下命令:

java -jar bnd-0.0.384.jar build -classpath slf4j-api-1.6.5.jar -output out  slf4j-api-1.6.5.bnd

就会在out目录下重新生成一个slf4j-api-1.6.5.jar,这个jar相比之前多了一个元数据文件MANIFEST.MF,内容如下:

Manifest-Version: 1.0
Export-Package: org.slf4j.helpers;uses:="org.slf4j.spi,org.slf4j",org.
 slf4j;uses:="org.slf4j.helpers,org.slf4j.impl,org.slf4j.spi",org.slf4
 j.spi;uses:="org.slf4j"
Bundle-SymbolicName: slf4j-api-1.6.5
Bundle-Name: slf4j-api-1.6.5
Bundle-Version: 0
Bundle-ManifestVersion: 2
Bnd-LastModified: 1517232511103
Import-Package: org.slf4j.impl;version="1.6.0"
Created-By: 1.8.0_65 (Oracle Corporation)
Tool: Bnd-0.0.384
 

 

通过这种方式可以把一个普通jar包(或者几个)封装为一个bundle,但这种命令行的方式还是显得很繁琐(更多关于bnd命令参数可以参考这里http://xjf975999.iteye.com/blog/1322057),也不方便管理,在正式环境中很少使用。在正式环境中,更多的使用maven插件进行打包,比如接下来介绍的maven-bundle-plugin插件(本质上是对bnd工具的封装,不用自己写命令行)。

 

maven-bundle-plugin插件

 

maven-bundle-pluginApache Felix项目中提供的一个maven插件,在项目的pom.xml文件中引入这个插件,并做一些简单的配置后,执行maven的打包命令 就可以自动生成一个bundle jar。下面展示一个简单的示例,目的是把servlet-api-2.5.jar这个第三方jar封装成一个独立的bundle。完整的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/xsd/maven-4.0.0.xsd">
   
<modelVersion>4.0.0</modelVersion>
 
    <artifactId>servlet</artifactId>
    <groupId>com.sky.bundles</groupId>
    <version>1.0-SNAPSHOT</version>
   
    <packaging>bundle</packaging>
 
    <dependencies>
        <dependency>
            <groupId>org.eclipse.osgi</groupId>
            <artifactId>org.eclipse.osgi</artifactId>
            <version>3.7.1</version>
            <scope>provided</scope>
        </dependency>
 
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>javax.servlet</Bundle-SymbolicName>
                        <Bundle-Name>servlet</Bundle-Name>
                        <Bundle-Description>servlet bundle</Bundle-Description>
                        <Bundle-Vendor>gantianxing</Bundle-Vendor>
                        <Bundle-Version>1.0.0</Bundle-Version>
                        <Embed-Dependency>servlet-api;scope=runtime</Embed-Dependency>
                        <Bundle-Activator>com.sky.servlet.activator.ServletActivator</Bundle-Activator>
                        <Export-Package>javax.servlet.*</Export-Package>
                        <!--<Private-Package>xxxx</Private-Package>-->
                        <Import-Package>org.osgi.framework</Import-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
 
</project>
 

 

这里重点关注以下几点:

1<packaging>bundle</packaging> 指定最终结果是要生成一个bundle jar

2Export-Package指令,用于指定该bundle需要导出哪些包,可以使用通配符(*)和否定符(!)。这里配置的javax.servlet.*,最终会导出javax.servlet 、javax.servlet.http、javax.servlet.resources这三个包。默认是*,可以自动导出所有包

3、Import-Package指令,用于指定该bundle需要导入哪些包。默认是*,可以自动导入所有用到的包。

4Embed-Dependency,用于jar包合并,可以实现把多个第三方jar包合并成一个公共的bundle,这里只配置了一个jarservlet-api,它会自动识别到dependency中相应的jar包。

5Bundle-Activator,指定自定义的激活器,这个不是必须的。

 

其他配置项跟模块层中介绍的配置项都是一样的,不用一一解读。另外如果不配置configuration节点,所有配置项都是采用默认值。更多关于maven-bundle-plugin插件的介绍可以直接查看官网:http://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html

 

可以看到这个pom.xml的配置与普通的配置方式只有些许差别,然后直接运行maven 打包命令,就可以生成bundle jar了。我这里使用的是idea开发工具,运行maven package target目录下会有一个新的jar包生成 servlet-1.0-SNAPSHOT.jar,其内容跟servlet-api-2.5.jar基本相同,只是新增了一个激活器和元数据文件MANIFEST.MF:

Manifest-Version: 1.0
Bnd-LastModified: 1517295026912
Build-Jdk: 1.8.0_65
Built-By: gantianxing
Bundle-Activator: com.sky.servlet.activator.ServletActivator
Bundle-Description: servlet bundle
Bundle-ManifestVersion: 2
Bundle-Name: servlet
Bundle-SymbolicName: javax.servlet
Bundle-Vendor: gantianxing
Bundle-Version: 1.0.0
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: servlet-api;scope=runtime
Export-Package: javax.servlet;version="1.0.0",javax.servlet.http;uses:
 ="javax.servlet";version="1.0.0",javax.servlet.resources;version="1.0
 .0"
Import-Package: org.osgi.framework;version="[1.6,2)"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.5))"
Tool: Bnd-3.5.0.201709291849

 

 

通过这种方式可以把自己写的代码连同一些列的第三方jar包打成一个大的bundle jar,一次性的加载到OSGI框架中,其他bundle导入对应的包即可使用。

 

另外在idea开发工具中完成上述配置后,ctrl+shift+alt+s 可以看到这里自动创建了一个OSGI bundle,配置信息如下:



 

 

如果看过上一篇博客的朋友,应该注意到了 这些配置本来需要我们手动配置的,如果使用maven-bundle-plugin插件这里已经自动完成了。你也可以像上一篇博客中提到,可以把这个bundle放到idea集成的equinox框架中执行。

 

总结

 

前一篇博客中讲到使用idea开发工具的插件可以用于生成元数据配置文件,本次使用maven-bundle-plugin插件生成元数据配置文件。最终我们发现其实两者是想通的,相比而言使用maven-bundle-plugin插件会更方便些,直接跟maven打包命令集成。

 

但他们本质上都是基于bnd工具实现的(其它的元数据生成工具或者插件,基本都是基于bnd实现的),有时候我们也可能需要直接使用bnd命令来制作一个bundle jar。在日常开发中,如果使用的maven来构建项目,还是建议使用maven-bundle-plugin插件。

 

 

 

  • 大小: 36 KB
0
0
分享到:
评论

相关推荐

    Intellij 13下OSGi的Maven例子

    在这个"IntelliJ 13下OSGi的Maven例子"中,我们将会探索如何在IntelliJ IDEA 13中设置和运行一个基于OSGi的Maven项目。首先,我们需要了解OSGi的核心概念,如Bundle(模块)、Service、生命周期管理等。Bundle是OSGi...

    乱凑的一个osgi的demo

    通常,一个OSGi示例项目会包含以下几个部分: 1. **配置文件**:如`config.ini`,这是OSGi框架启动时读取的配置文件,用于定义启动参数、服务设置等。 2. **Bundle(模块)**:在OSGi中,Java代码被打包成bundle,...

    blueprint-osgi-bundle:OSGi 示例

    **标题解析:** "blueprint-osgi-bundle:OSGi 示例" 指的是一个基于OSGi(Open Service Gateway Initiative)框架的示例项目,它使用了Blueprint服务容器来管理服务组件。Blueprint是Apache Felix项目中的一个子项目...

    Spring OSGi 入门.pdf

    - **开发工具**: 使用 Eclipse 或 IntelliJ IDEA 的 OSGi 插件,如 PDE 或 Bndtools,可以方便地创建和管理 OSGi 捆绑。 - **打包和部署**: 将 Spring 应用转换为 OSGi 捆绑,可以使用 Maven 或 Gradle 的 OSGi ...

    构建工具:maven简介

    Maven是一个广泛使用的Java项目管理和构建自动化工具,它基于项目对象模型(POM)的概念,能够管理项目的生命周期,包括编译、测试、打包、发布等。Maven使得开发者可以更加专注于代码的编写,而不是繁琐的构建过程...

    jgraphx-publish:将JGraphX发布到Maven Central

    jar,javadoc和源代码已发布到Maven Central Gradle构建(代码自动导入IDEA) OSGI清单条目 自动模块名称 用法 &lt; groupId&gt;com.github.vlsi.mxgraph&lt;/ groupId&gt; &lt; artifactId&gt;jgraphx &lt; version&gt;4.2.2 文献...

    Felix华为Felix开发和运行包。

    7. `ide-plugins/` - 集成开发环境(IDE)的插件,如Eclipse或IntelliJ IDEA,方便在这些环境中开发OSGi应用。 8. `build-tools/` - 构建和打包工具,如Maven插件或Ant任务,用于构建OSGi bundle。 9. `README.md` ...

    基于Java的实例源码-懒惰者代码生成器 IdlerCodeGenerator.zip

    描述中提到的"基于Java的实例源码-懒惰者代码生成器 IdlerCodeGenerator.zip"与标题一致,强调这是一个包含源代码的实际示例。这意味着用户不仅可以使用这个工具,还能查看和学习其内部实现,这对于Java开发者来说是...

    intellij-dev-life:为 dev.life 会话创建的示例存储库

    【标题】"intellij-dev-life:为 dev.life 会话创建的示例存储库" 提供了一个关于在 Liferay 平台上使用 IntelliJ IDEA 进行开发的实例。这个项目是为一个名为 "dev.life" 的特定讨论或研讨会设计的,旨在帮助开发者...

    Rifidi Edge Server v1.3开发者文档

    - 设置IDE:使用Eclipse、IntelliJ IDEA或其他支持Maven的IDE。 - 配置Maven:确保Maven正确安装并配置到IDE中。 - 导入SDK:将SDK项目导入到IDE中,并确保正确配置了依赖关系。 ##### 2. 转换1.2版应用程序至...

    java插件

    在Java生态系统中,插件主要用于提供可扩展性,常见的如Eclipse和IntelliJ IDEA等集成开发环境(IDE)中的插件,它们能够增强IDE的功能,例如代码自动完成、调试工具、版本控制集成等。此外,还有像Tomcat服务器中的...

    apache-camel-1.1.0.tar.gz

    要开始使用Apache Camel,你需要将这个包导入到你的开发环境中,如IDEA、Eclipse等,并根据项目需求配置相应的组件和路由规则。对于初学者,建议先阅读官方文档,了解基本概念和工作原理,然后通过简单的示例来实践...

    kotlin语言基础教程.pdf

    - **Kotlin 与 OSGi**:Kotlin 在 OSGi 环境下的使用。 - **编译器插件**:自定义 Kotlin 编译器的行为。 - **常见问题解答 (FAQ)**:解决开发者在使用 Kotlin 过程中遇到的常见问题。 - **与 Java 比较**:Kotlin ...

    apache-cxf-2.6.2-src.zip

    此外,CXF还提供了一个强大的基于IDE的插件,如Eclipse或IntelliJ IDEA插件,帮助开发者更方便地使用CXF。 5. **安全机制**:CXF支持多种安全模型,包括基本认证、 Digest认证、SSL/TLS、WS-Security(Web Services...

    kotlin语法

    对于学习和使用Kotlin,有多种资源可供参考,包括使用Gradle、Maven、Ant等构建工具的文档,以及Kotlin与OSGi的集成指南。IDE支持如IntelliJ IDEA Ultimate的Kotlin插件提供了强大的支持,包括对Spring等框架的特定...

    使用JARCONNECTION实现插件机制

    标签中的“工具”可能指的是辅助开发插件系统的一些工具,如IDE插件(如Eclipse或IntelliJ IDEA的插件)、构建工具(如Maven或Gradle的插件系统)或特定的插件框架(如OSGi)。 综上所述,`JARCONNECTION`实现的...

    kotlin文档

    Kotlin的协程支持有助于构建高度可伸缩的服务器端应用,并且与现有基于Java的技术栈完全兼容。 文档中还介绍了Kotlin的基本语法、编程习惯用法、编码规范、包的使用、控制流、函数和Lambda表达式、面向对象编程的类...

    kotlin中文教程

    工具和生态系统方面,本教程介绍了如何使用Kapt、Gradle、Maven和Ant等构建工具,以及Kotlin与OSGi编译器插件的集成。编码规范部分提供了代码编写标准,以及Kotlin语言演进和不同组件稳定性演进的讨论。 本书是...

Global site tag (gtag.js) - Google Analytics