安装好了Apache Felix,下面要做的是开发我的第一个Bundle。整个过程是参考Apache Felix Tutorial Example 1 - Service Event Listener Bundle实现的。
打开一个DOS窗口,切换到要存放Bundle的目录,这里以D:\develop\eclipse-jee-indigo-SR2-win32\workspace\felix-analysis为例。然后使用Maven创建一个空的项目。
mvn archetype:create -DgroupId=felix.tutorial -DartifactId=example1 -DpackageName=felix.tutorial.example1 -Dversion=1.0.0
执行完成后会出现下面的目录结构:
切换到目录src\main\java\felix\tutorial\example1,删除Maven创建的App.java文件,新建文件Activator.java,文件内容如下:
package felix.tutorial.example1; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceEvent; /** * This class implements a simple bundle that utilizes the OSGi * framework's event mechanism to listen for service events. Upon * receiving a service event, it prints out the event's details. **/ public class Activator implements BundleActivator, ServiceListener { /** * Implements BundleActivator.start(). Prints * a message and adds itself to the bundle context as a service * listener. * @param context the framework context for the bundle. **/ public void start(BundleContext context) { System.out.println("Starting to listen for service events."); context.addServiceListener(this); } /** * Implements BundleActivator.stop(). Prints * a message and removes itself from the bundle context as a * service listener. * @param context the framework context for the bundle. **/ public void stop(BundleContext context) { context.removeServiceListener(this); System.out.println("Stopped listening for service events."); // Note: It is not required that we remove the listener here, // since the framework will do it automatically anyway. } /** * Implements ServiceListener.serviceChanged(). * Prints the details of any service event from the framework. * @param event the fired service event. **/ public void serviceChanged(ServiceEvent event) { String[] objectClass = (String[]) event.getServiceReference().getProperty("objectClass"); if (event.getType() == ServiceEvent.REGISTERED) { System.out.println( "Ex1: Service of type " + objectClass[0] + " registered."); } else if (event.getType() == ServiceEvent.UNREGISTERING) { System.out.println( "Ex1: Service of type " + objectClass[0] + " unregistered."); } else if (event.getType() == ServiceEvent.MODIFIED) { System.out.println( "Ex1: Service of type " + objectClass[0] + " modified."); } } }
用文字编辑软件打开pom.xml文件,修改成如下内容(注意这里的packaging变成了bundle):
<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> <groupId>felix.tutorial</groupId> <artifactId>example1</artifactId> <version>1.0.0</version> <packaging>bundle</packaging> <name>Service listener example</name> <description>A bundle that displays messages at startup and when service events occur</description> <organization> <name>Apache Felix</name> </organization> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Bundle-Activator>felix.tutorial.example1.Activator</Bundle-Activator> <Import-Package>org.osgi.framework</Import-Package> </instructions> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.osgi.core</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
打包bundle,在DOS窗口下执行mvn package。执行完成后target目录下有一个example1-1.0.0.jar文件,这就是最终需要发布的bundle文件。使用WinRar打开example1-1.0.0.jar,找到META-INFI/MANIFEST.MF,查看其内容,会发现maven-bundle-plugin产生了很多的条目,这些内容对OSGi容器非常的重要。
启动Felix,使用start file:/D:/develop/eclipse-jee-indigo-SR2-win32/workspace/felix-analysis/example1/target/example1-1.0.0.jar命令启动bundle。
为了测试我们的bundle,可以对它进行停止和启动,相应的会输出对应的信息提示。注意:这里启动和停止命令后面的5,是特定于当前Felix实例的example bundle序号,需要根据情况相应进行改变。
到这一步,我们的第一个bundle也就大功告成了。
使用Maven开发Bundle的文章: