从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中进行资源的释放,内存的回收。

#

results matching ""

    No results matching ""