Karaf教程第1部分 安装Karaf与第一个应用

1.1 karaf入门

    在这个帖子中,我将编写关于Apache Karaf的一系列帖子。那么什么是Karaf,你为什么对它感兴趣呢?Karaf是基于Equinox或者Felix的OSGi容器。相对于其它优良的容器来说,主要的不同点是karaf带来了优秀的features管理。

Karaf的杰出特性:

  1. 类似于Bash的完备feature扩展控制台
  2. SSH控制台
  3. maven仓库部署bundlefeature
  4. 易于从命令行创建新的实例

    所有这些特性使得开发基于服务器的OSGi应用几乎与常规的Java应用一样容易。部署和管理是我迄今为止见到的比其他应用服务器更好。All this is combined with a small footprint as well of karaf as the resulting applications. 在我看来,这将允许轻量级的开发风格,就像伴随spring应用的灵活性的JavaEE 6一样。

1.2 安装与第一次启动

  1. Karaf网站下载Karaf 3.0.3
  2. 提取,用bin/karaf启动

你应该看到欢迎界面:

        __ __                  ____

       / //_/____ __________ _/ __/

      / ,<  / __ `/ ___/ __ `/ /_

     / /| |/ /_/ / /  / /_/ / __/

    /_/ |_|\__,_/_/   \__,_/_/

 

  Apache Karaf (3.0.3)

 

Hit '<tab>' for a list of available commands

and '[cmd] \--help' for help on a specific command.

Hit '<ctrl-d>' or 'osgi:shutdown' to shutdown Karaf.

 

karaf@root()>

1.3 一些方便的命令行

命令

描述

la

显示所有安装的bundle

service:list

显示活动的OSGi服务。这个列表很长。你可以使用unix管道,类似于"ls | grep admin"

exports

显示所有导出的包(package),以及提供这些包的bundle。这有助于找到一个包来自于哪个bundle。

feature:list

显示已经安装的feature和可以安装的feature

feature:install webconsole

安装feature(一系列bundle和其他的feature)。使用上面的命令我们安装了Karaf webconsole。它可以通过http://localhost:8181/system/console访问。用karaf/karaf登录,花费一点时间看看它提供了什么。

log:tail

显示日志。使用ctrl-c返回控制台。

Ctrl-d

退出console。如果这是主控制台,那么karaf就会被停止。

OSGi 容器在重启之后保存状态

    注意Karaf像所有的osgi容器一样只维护安装的和启动的bundle的最后的状态。所以如果某些功能不再工作,重启是没有用的。为了真正地启动一个新的,要停止karaf,删除data目录。

检查日志

Karaf是非常安静的。为了不错误消息,要一直保持tail -f data/karaf.log打开!!

1.4 任务列表:一个小的osgi应用

    Karaf本身是一个很好的但是没有用的容器。所以,让我们创建第一个应用。创建一个OSGi应用是很简单的,maven提提供了很大的帮助。与标准的maven工程的区别很小。为了编写这个应用,我推荐使用安装了m2eclipse插件的Eclipse 4

获取源代码

  1. 克隆示例程序:git clone git@github.com:cschneider/Karaf-Tutorial.git 
  2. 或者
  3. 下载示例工程:https://github.com/cschneider/Karaf-Tutorial/zipball/master 并提取到某个目录。

导入到Eclipse

  1. 启动Eclipse
  2. Eclipse Package explorer中:Import -> Existing maven project -> Browse,选择提取的目录的tasklist子目录
  3. Eclipse会显示所有的maven工程
  4. 点击through to import with defaults

Eclipse现在会导入工程,并用m2eclipse导入所有的依赖。

tasklist示例包含三个工程

Module

描述

tasklist-model

服务接口和任务类

tasklist-persistence

简单的持久实现,提供了TaskService

tasklist-ui

Servlet,使用TaskService显示任务列表

tasklist-features

应用的Feature描述,这样在Karaf中安装会很容易

1.4.1 Tasklist-persistence工程

    这个工程包含了内部的模型和服务实现。这个模型是Task类和TaskService接口。持久实现TaskServiceImpl在简单的HashMap中管理任务。使用blueprint上下文将TaskService作为一个OSGi服务发布BlueprintOSGi依赖注入的标准,非常类似于spring上下文

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <bean id="taskService" class="net.lr.tasklist.persistence.impl.TaskServiceImpl" />

    <service ref="taskService" interface="net.lr.tasklist.model.TaskService" />

</blueprint>

    Bean标签创建了TaskServiceImpl的单例对象。Service标签将这个单例作为OSGi服务以TaskService接口的形式发布。

Pom.xml用于打包bundlemaven-bundle-plugin插件使用OSGiManifest文件创建了jar包。默认情况下,这个插件导入了在Java文件导入的或者blueprint上下文引用的所有的包(package)。它也导出除了字符串实现和内部之外所有的包。在我们的示例中,我们想要导入模型的包,但不导入持久实现的包。由于使用了命名惯例,我们不需要额外的配置。

1.4.2 Tasklist-ui

    这个ui工程包含了一个TaskServlet类,用于显示任务列表和独立的任务。要与Task一起工作,servlet需要TaskService

    为了注入TaskService和发布servlet,使用下面的blueprint上下文。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <reference id="taskService" availability="mandatory" interface="net.lr.tasklist.model.TaskService" />

    <bean id="taskServlet" class="net.lr.tasklist.ui.TaskListServlet">

        <property name="taskService" ref="taskService"></property>

    </bean>

    <service ref="taskServlet" interface="javax.servlet.http.HttpServlet">

        <service-properties>

            <entry key="alias" value="/tasklist" />

        </service-properties>

    </service>

</blueprint>

Reference标签使得blueprint搜索并等待实现了TaskService接口的服务,并创建bean "taskService"

bean taskServlet实例化了servlet类,并被注入了taskService

Service标签将servlet作为OSGi服务以HttpServlet 接口发布,并设置了别名。

这种发布servlet的方式还没有标准化,但是已经被pax web whiteboard extender支持了。这个extender使用HttpServlet接口和OSGihttp服务注册每一个服务。它使用alias属性设置访问servlet的路径。

    参阅:http://wiki.ops4j.org/display/paxweb/Whiteboard+Extender

1.4.3 Tasklist-features

    最后一个工程只是将feature描述安装maven仓库,这样我们在Karaf中就可以很容易地安装它。这个描述定义了一个名为tasklistfeature以及要从maven仓库安装的bundle

<feature name="example-tasklist" version="${pom.version}">

    <feature>example-tasklist-persistence</feature>

    <feature>example-tasklist-ui</feature>

</feature>

<feature name="example-tasklist-persistence" version="${pom.version}">

    <bundle>mvn:net.lr.tasklist/tasklist-model/${pom.version}</bundle>

    <bundle>mvn:net.lr.tasklist/tasklist-persistence/${pom.version}</bundle>

</feature>

<feature name="example-tasklist-ui" version="${pom.version}">

    <feature>http</feature>

    <feature>http-whiteboard</feature>

    <bundle>mvn:net.lr.tasklist/tasklist-model/${pom.version}</bundle>

    <bundle>mvn:net.lr.tasklist/tasklist-ui/${pom.version}</bundle>

</feature>

    一个feature可以包含其他要被安装的featurebundleBundle通常使用mvn url。这意味着它们是从配置的maven仓库或者你本地的maven仓库(例如~/.m2/repository)加载。

1.5 在Karaf中安装应用

feature:repo-add mvn:net.lr.tasklist/tasklist-features/1.0.0-SNAPSHOT/xml

feature:install example-tasklist-persistence example-tasklist-ui

    增加feature描述到Karaf,这样feature就会被添加到可用的features中,然后安装并启动tasklist feature。在该命令行之后,tasklist应用就应该运行起来了。

list

    检查所有的tasklistbundle都处于active状态。如果没有处于active状态,尝试启动它们,并检查log

http:list

 

ID | Servlet         | Servlet-Name   | State       | Alias     | Url

-------------------------------------------------------------------------------

56 | TaskListServlet | ServletModel-2 | Deployed    | /tasklist | [/tasklist/*]

    应该显示出TaskListServlet。默认情况下,示例启动在http://localhost:8181/tasklist

    你可以创建一个文本文件来改变这个端口,即"etc/org.ops4j.pax.web.cfg",文件的内容是"org.osgi.service.http.port=8080"。这将告诉HttpService使用端口8080。现在tasklist应用就可以通过http://localhost:8080/tasklist访问了。

1.6 总结

    在这个教程中,我们安装了Karaf,学习了一些命令行。然后我们创建了一个小的 OSGi应用,该应用演示了servletOSGi服务,blueprint和白板模式。

    在下一个教程中,我们看看如何在OSGi中使用Apache CamelApache CXF

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐