用Maven开发OSGI Bundle

    可能99%用Java开发软件的同学都会用Eclipse来作为开发用IDE,特别是开发OSGI方面的,可能更有可能用Eclipse。但很不幸,可能是因为早期对Eclipse的“童年”阴影,对Eclipse大量强大的功能,觉得学习繁琐,所以本人对Eclipse有点抗拒,当然这只是个人的感受:)。

    那么不用Eclipse,我可以用什么呢?总不能用文本编辑器来写代码吧,所以我选择了netbean作为我的IDE,因为我感觉它用起来比较简单。但IDE通常会有自己的工程组织方式,所以Eclipse的工程要放在netbean上用,或者反之,都不是很方便。所以我又选择用了Maven。

    相信Maven是目前开源项目中最普遍使用的一套项目管理工具。既然是这样,我们为什么要将我们的项目和IDE捆绑在一起,为什么不统一用这个最流行的工具来构建一个项目工程,而是采用特定于某个IDE的方式来构建工程呢?

    在Netbean里,我们可以直接打开Maven工程,而在Eclipse里,则只需用mvn eclipse:eclipse就可以将Maven工程转化成一个Eclipse工程。

    开始开发OSGI Bundle时,自然也就想到用Maven来构建工程。首先,Bundle本身就是一个JAR包,它和普通JAR包的区别主要在于Manifest.mf上,所以,要构建Bundle,直接沿用构建JAR包的方式即可,再加上最方便处理Manaifest.mf的功能即可,于是,就有了一下这样的模板(POM.XML):

<project xmlns:pom="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <groupId>com.ponder.tutorials.app01</groupId>
    <artifactId>Calculator</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>app01-Calculator</name>
    <url>http://app01.ponder.com/Calculator/</url>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
             <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
               <configuration>
                <archive>
                 <manifest>
                  <addClasspath>true</addClasspath>
                  <classpathPrefix>lib/</classpathPrefix>
                 </manifest>
                 <manifestEntries>
                  <Class-Path>${project.build.finalName}.jar</Class-Path>
                  <Built-By>Ponder</Built-By>
                  <Bundle-ManifestVersion>2</Bundle-ManifestVersion>
                  <Bundle-Name>
                   ${project.groupId}.${project.ArtifactId}
                  </Bundle-Name>
                  <Bundle-SymbolicName>${project.name}</Bundle-SymbolicName>
                  <Bundle-Version>${project.version}</Bundle-Version>
                  <Bundle-Vendor>${project.groupId}</Bundle-Vendor>
                  <Bundle-Activator>
                   ${project.groupId}.${project.ArtifactId}.Activator
                  </Bundle-Activator>
                  <Export-Package>
                   ${project.groupId}.${project.ArtifactId}.Export
                  </Export-Package>
                  <Import-Package>org.osgi.framework</Import-Package>
                  <Embed-Dependency>*</Embed-Dependency>
                  <DynamicImport-Package>*</DynamicImport-Package>
                 </manifestEntries>
                </archive>
              </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.2.0</version>
            <type>jar</type>
        </dependency>
    </dependencies>
</project>


    其中用了maven-jar-plugin,通过这个plugin的Configuration/archive/manifest的配置,就可以很方便地设置Bundle所需的Manifest项,打包时会自动创建manifest.mf。

    当然以上只是最基础的部分,我们还可以基于Maven提供的Surefire插件做Bundle的单元测试,利用Maven的父项目来将一组相关联的Bundle项目组合成一个大的项目,还可以将Maven的repository当作OSGI的OBR(OSGI Bundle Repository),用于Bundle的部署发布方面。

猜你喜欢

转载自killko.iteye.com/blog/1779708