您的位置:首页 > 其它

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

2017-10-10 14:55 337 查看

原文链接:http://blog.csdn.net/wusandi/article/details/78172261

1.1 karaf入门

    在这个帖子中,我将编写关于Apache Karaf的一系列帖子。那么什么是Karaf,你为什么对它感兴趣呢?Karaf是基于Equinox或者Felix的OSGi容器。相对于其它优良的容器来说,主要的不同点是karaf带来了优秀的features管理。
Karaf的杰出特性:
类似于Bash的完备feature扩展控制台
SSH控制台
从maven仓库部署bundle和feature
易于从命令行创建新的实例
    所有这些特性使得开发基于服务器的OSGi应用几乎与常规的Java应用一样容易。部署和管理是我迄今为止见到的比其他应用服务器更好。All this is combined with a small footprint as well of karaf as the resulting applications. 在我看来,这将允许轻量级的开发风格,就像伴随spring应用的灵活性的JavaEE 6一样。

1.2 安装与第一次启动

Karaf网站下载Karaf 3.0.3
提取,用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。
获取源代码
克隆示例程序:git clone git@github.com:cschneider/Karaf-Tutorial.git 
或者
下载示例工程:https://github.com/cschneider/Karaf-Tutorial/zipball/master 并提取到某个目录。
导入到Eclipse
启动Eclipse
在Eclipse Package explorer中:Import -> Existing maven project -> Browse,选择提取的目录的tasklist子目录。
Eclipse会显示所有的maven工程
点击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服务发布。Blueprint是OSGi依赖注入的标准,非常类似于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用于打包bundle,maven-bundle-plugin插件使用OSGi的Manifest文件创建了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接口和OSGi的http服务注册每一个服务。它使用alias属性设置访问servlet的路径。
    参阅:http://wiki.ops4j.org/display/paxweb/Whiteboard+Extender

1.4.3 Tasklist-features

    最后一个工程只是将feature描述安装到maven仓库,这样我们在Karaf中就可以很容易地安装它。这个描述定义了一个名为tasklist的feature以及要从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可以包含其他要被安装的feature和bundle。Bundle通常使用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
    检查所有的tasklist的bundle都处于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应用,该应用演示了servlet,OSGi服务,blueprint和白板模式。
    在下一个教程中,我们看看如何在OSGi中使用Apache Camel和Apache CXF。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: