Karaf教程第1部分 安装Karaf与第一个应用
Karaf教程第1部分 安装Karaf与第一个应用1.1 karaf入门 在这个帖子中,我将编写关于Apache Karaf的一系列帖子。那么什么是Karaf,你为什么对它感兴趣呢?Karaf是基于Equinox或者Felix的OSGi容器。相对于其它优良的容器来说,主要的不同点是karaf带来了优秀的features管理。Karaf的杰出特性:类似于Bash的完备fea
Karaf教程第1部分 安装Karaf与第一个应用
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。
更多推荐
所有评论(0)