Bundlor入门

工程 | Ben Hale | 2009年3月20日 | ...

正如Rob的博文所指出的那样,在过去的几个月里,我们了解了很多关于人们如何管理他们自己的OSGi应用程序。

我们发现一些开发者想要管理他们自己的bundle清单,但是需要一些帮助来自动化细节,例如指定一系列导入中的包版本。其他开发者希望根据其项目的內容和构建文件中指定的依赖项生成清单。此外,两种类型的开发者都需要使用没有必要的OSGi元数据以使其能够在OSGi服务平台中使用的现有库。

Bundlor为所有这些情况提供了解决方案,并且是我们内部使用了一段时间的工具,用于管理发布到SpringSource企业Bundle存储库的bundles。Bundlor自动化检测依赖项以及在JAR创建后创建OSGi清单指令的过程。它以JAR和模板作为输入,该模板包含标准OSGi清单头的超集。然后,它分析JAR中包含的源代码和支持文件,将模板应用于结果,并生成清单。

模板机制

Bundlor模板机制使用标准Java清单格式,并且包含标准OSGi清单头的超集。下表列出了所有Bundlor特定的清单模板头及其用法。
描述
Excluded-Exports 必须不添加到清单的包的逗号分隔列表Export-Package头。
Excluded-Imports 默认情况下,Bundlor将为它确定由jar中的代码或特殊文件引用的每个包添加导入。此头允许指定不生成导入的包的逗号分隔列表。
Export-Template 默认情况下,Bundlor将所有导出的包版本指定为Bundle-Version。此头允许以不同版本导出单个导出的包。例如:Export-Template com.foo.*;version="1.5"将导致任何Export-Package条目为com.foo或其子包的版本为1.5.
Ignored-Existing-Headers 对于正在为其生成清单的JAR已包含符合OSGi的清单的情况,此头可用于列出Bundlor应忽略的原始清单中的头。
Import-Template 此头用于增强Bundlor通过字节码和特殊文件分析生成的包导入。通常,这将是为导入设置版本,并且在某些情况下,将其标记为可选。头的值采用包名称和属性的逗号分隔列表的形式。
包名称末尾的支持通配符“*”用于匹配多个包。例如:Import-Template: com.foo;version=[1.0,2.0);resolution:=optional,com.bar.*;version="[1.5,1.6)"将导致为com.foo包生成的任何导入的版本为1.0(包含)到2.0(不包含),并被视为可选,并且对于com.bar或其子包的任何导入的版本为1.5(包含)到1.6(不包含)。

以下是Spring Binding bundle中的Bundlor清单模板示例,显示了通配符和显式Import-Package语句的使用。

Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.springframework.binding
Bundle-Name: Spring Binding
Bundle-Vendor: SpringSource
Import-Package:
 ognl;version="[2.6.9, 3.0.0)";resolution:=optional,
 org.jboss.el;version="[2.0.0, 3.0.0)";resolution:=optional
Import-Template:
 org.springframework.*;version="[2.5.4.A, 3.0.0)",
 org.apache.commons.logging;version="[1.1.1, 2.0.0)",
 javax.el;version="[2.1.0, 3.0.0)";resolution:=optional

检测标准

给定一个JAR文件,Bundlor可以从各种来源检测候选导入。有关可以检测到的内容的完整列表和示例,请参阅用户指南

Bundlor扫描以下类型

  • Java类
    • 声明的类型超类类型
    • 声明的类型实现的接口类型
    • 声明的类型注解类型
    • 声明的字段类型
    • 声明的字段值类型
    • 声明的方法参数类型
    • 声明的方法返回类型
    • 声明的方法异常类型
    • 声明的方法注解类型
    • 对字段所有者类型的引用
    • 对字段类型的引用
    • 声明的局部变量类型
    • 对方法声明类型的引用
    • 对方法返回类型的引用
    • 对方法参数类型的引用
    • 数组类型的分配
    • 声明的参数注解类型
    • 捕获的异常类型
    • 实例化类型
    • 强制转换目标类型
    • Instanceof类型
    • 声明的常量类型
  • Spring上下文配置文件
    • 指定的类名,将来会随着对Spring模式的了解而改进
  • JPA
    • 提供者标签来自persistence.xml文件
  • Hibernate映射文件
    • //class/@name
    • //id/@type
    • //generator/@class
    • //composite-id/@class
    • //discriminator/@type
    • //property/@type
    • //many-to-one/@class
    • //one-to-one/@class
    • //one-to-many/@class
    • //many-to-many/@class
    • //version/@type
    • //component/@class
    • //dynamic-component/@class
    • //subclass/@name
    • //joined-subclass/@name
    • //union-subclass/@name
    • //import/@class
  • 属性文件
    • 定义为属性值的类

获取Bundlor

Bundlor可以从Bundlor页面下载zip文件获取。它也可以作为Ivy和Maven工件在SpringSource企业Bundle存储库中访问。此外,还有一个详细的用户指南可用。

使用Bundlor

Bundlor有四种不同的形式
  • Apache Maven插件
  • Apache ANT任务
  • 命令行应用程序
  • Eclipse插件(更多信息在单独的博客中)
以下说明仅描述了在每个环境中Bundlor的简单用法。有关Bundlor语法的完整信息,请参阅用户指南

Maven

Maven插件允许从Maven项目内部运行Bundlor。使用此任务,可以将JAR转换为bundle或将清单写入文件系统。

将SpringSource企业Bundle存储库添加到pom.xml文件。

<pluginRepositories>
  <pluginRepository>
    <id>com.springsource.repository.bundles.milestone</id>
    <name>SpringSource Enterprise Bundle Repository</name>
    <url>http://repository.springsource.com/maven/bundles/milestone</url>
  </pluginRepository>
...
</pluginRepositories>

添加bundlor插件到pom.xml文件

<build>
  <plugins>
    <plugin>
      <groupId>com.springsource.bundlor</groupId>
      <artifactId>com.springsource.bundlor.maven</artifactId>
      <version>1.0.0.M2</version>
      <executions>
        <execution>
          <id>bundlor</id>
          <goals>
            <goal>transform</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  ...
  </plugins>
...
</build>

最后,使用package命令构建bundle。

mvn install package

ANT

ANT任务允许在任何基于ANT的构建系统中运行Bundlor。使用此任务,可以将JAR转换为bundle。

要在ANT内部运行Bundlor,首先定义一个bundlor命名空间。

<project name="bundlor-sample-ant"
    xmlns:bundlor="antlib:com.springsource.bundlor.ant">

然后将bundlor任务导入构建。

<target name="bundlor.init">
  <taskdef resource="com/springsource/bundlor/ant/antlib.xml"
      uri="antlib:com.springsource.bundlor.ant">
    <classpath id="bundlor.classpath">
      <fileset dir="${bundlor.home}/dist"/>
      <fileset dir="${bundlor.home}/lib"/>
    </classpath>
  </taskdef>
</target>

最后,使用bundlor任务。

<bundlor:bundlor
    bundlePath="${basedir}/org.springframework.integration.jar"
    outputPath="${basedir}/target/org.springframework.integration.jar"
    bundleVersion="1.0.2.BUILD-${timestamp}"
    manifestTemplatePath="${basedir}/template.mf"/>

命令行

命令行界面是使用清单模板快速显示bundle的Bundlor生成的OSGi清单或实际转换bundle的一种方法。

要从命令行运行Bundlor,请更改目录到$BUNDLOR_HOME/bin目录并运行bundlor.shbundlor.bat.

% ./bundlor.sh transform \
--bundle ./org.springframework.integration.jar \
--manifest ./template.mf \
--outputfile ./target/org.springframework.integration.jar

Transformed bundle written to ./target/org.springframework.integration.jar
%

未来的Bundlor

Bundlor是一款新产品,还有很大的发展空间。Bundlor现在使用Scrum进行规划,我们希望让社区更多地了解开发过程。当前的sprint和发布积压可在Bundlor JIRA上查看。Bundlor的未来发展方向由我们的用户决定,因此请花时间对现有问题进行投票,并为积压中未涵盖的内容创建新问题。

获取Spring新闻通讯

通过Spring新闻通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加快您的进步。

了解更多

获得支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看Spring社区中所有即将举行的活动。

查看全部