那么不用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的部署发布方面。