从maven库编译karaf
以前开发都是直接使用ODL的发布包,每次下载都很浪费时间,而且我们也不需要这么多项目;特别是在测试开发一个新项目时,我们需要根据自己的需要进行裁剪,只编译需要的ODL项目。
最小karaf项目
<project>
<parent>
<groupId>org.opendaylight.controller</groupId>
<artifactId>karaf-parent</artifactId>
<version>1.6.2-Beryllium-SR2</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion> <!-- Model Version -->
<groupId>come.cisco.crdc</groupId> <!-- Group ID -->
<artifactId>crdc-karaf</artifactId> <!-- Artifact ID -->
<version>1.0.0-SNAPSHOT</version> <!-- version -->
<name>${project.artifactId}</name> <!-- Name -->
<dependencies>
<dependency>
<groupId>org.apache.karaf.features</groupId>
<artifactId>framework</artifactId>
<type>kar</type>
</dependency>
</dependencies>
</project>
运行程序
target/assembly/bin/karaf
第一个能在karaf上运行的纯OSGi Bundle
这个程序与ODL没有关系,我们用它来学习OSGi本身的bundle程序运行机制。
运行下列程序,我们可以得到一个bundle例子
mvn archetype:generate -DarchetypeGroupId=org.apache.karaf.archetypes -DarchetypeArtifactId=karaf-bundle-archetype -DarchetypeVersion=2.3.3 -DgroupId=com.test -DartifactId=TestBundle -Dversion=1.0-SNAPSHOT
生成的文件如下:
TestBundle/
├── pom.xml
└── src
└── main
└── java
└── com
└── test
└── Activator.java
唯一的JAVA源文件
cat src/main/java/com/test/Activator.java
package com.test;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
public void start(BundleContext context) {
System.out.println("Starting the bundle");
}
public void stop(BundleContext context) {
System.out.println("Stopping the bundle");
}
}
编译
运行Maven的编译命令,将生成对应的jar包 (target/TestBundle-1.0-SNAPSHOT.jar)
mvn clean package
运行,安装
首先运行上一个karaf的程序,我们将在karaf的框架内安装和反安装我们生成的TestBundle包。
target/assembly/bin/karaf
在karaf的提示行下,输入安装命令install file:/...
, 你可以得到一个Bundle ID;下例为64。我们可以用此ID来控制Bundle的启动和停止。
opendaylight-user@root>install file:/home/test/workspace/karaf/karaf/test/TestBundle/target/TestBundle-1.0-SNAPSHOT.jar
Bundle ID: 64
检查
opendaylight-user@root>bundle:list | grep TestBundle
64 | Resolved | 80 | 1.0.0.SNAPSHOT | TestBundle Bundle
opendaylight-user@root>
启动Bundle
start 64
停止Bundle
stop 64
反安装
opendaylight-user@root>bundle:uninstall 64
opendaylight-user@root>bundle:list | grep TestBundle
opendaylight-user@root>
代码分析
以下是启动和停止Bundle的输出,从中可以看出我们的启动和停止的代码调用到了。
opendaylight-user@root>start 64
Starting the bundle
opendaylight-user@root>stop 64
Stopping the bundle
opendaylight-user@root>
从代码中看,我们实现了BundleActivator的实例化,通过这个来实现OSGi的主要接口。
如果需要在启动中增加复杂的处理,直接在JAVA的代码中写即可;值得注意的是,我们可以再stop中进行资源的释放,内存的回收。